正規表現を使用してbashのファイル名から数字のみを選択する方法

正規表現を使用してbashのファイル名から数字のみを選択する方法

次のスキーマファイルを含むディレクトリがあります。

SNAFU12.jpg
SNAFU1.jpg
SNAFU123.jpg

私はこのコードを試しましたが、出力は生成されませんでした。

 for f in *.jpg; do
   regex="/\d/g"
   file="f:5:6"
   if [[ $file =~ $regex ]]; then
        echo ${BASH_REMATCH[1]}
   fi
 done

私の予想結果は次のとおりです。

12
1
23

答え1

/* nixのディレクトリ区切り文字である2つのsを一致させようとしていますが、それを含むファイル名がないため、正規表現パターンはどれも一致しません。私は/.../gそれがあなたのJavaScript(または他の)正規表現の練習から来たと仮定します。そうではありませんか?

する:

for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

bash正規表現は\d文字クラスキーワードをサポートしません[0-9]。したがって、使用する方が良いです[0-9]。に依存するには、locale文字クラスを使用してください[:digit:]

for i in *.jpg; do [[ $i =~ ([[:digit:]]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

例:

$ for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done
123
12
1

答え2

lsファイルを含むフォルダの出力を変更します。

ls SNAFU* | sed -e 's/SNAFU\|.jpg//g'

関連情報