4

私は(正規表現の初心者)、文字列ではなく数字で始まるディレクトリ内のファイルのみを検索しようとしています。

私の正規表現は

 .*/^\d+\w+[A][D][0-5][0-9].mat

(ファイル名の末尾には、ADという文字と、MAT拡張子の前の0〜54の数字があります。これをに渡すので、これを含めます./。)findbash

ただし、これは次のような両方のファイルに対してfalseを返します。

./times_121312_going_down_AD33.mat

./121312_going_down_AD33.mat

私は何が間違っているのですか?

4

4 に答える 4

13

これがfindの実例です

$ ls -l *.mat
-rw-r--r-- 1 root root 0 Jan 13 15:09 121312_going_down_AD33.mat
-rw-r--r-- 1 root root 0 Jan 13 15:09 times_121312_going_down_AD33.mat

$ find . -type f -regex '.*/[0-9]+_.*AD[0-5][0-9]\.mat$'
./121312_going_down_AD33.mat

\dPOSIX正規表現では機能し\wないため、thoを使用できます。[:digit:]

正規表現の説明

  • .*\ nを除く任意の文字を、0回以上繰り返します
  • /文字「/」に文字通り一致する
  • [0-9]+0から9までの任意の文字を1回以上繰り返します
  • _文字「_」に文字通り一致する
  • .*\ nを除く任意の文字を、0回以上繰り返します
  • A文字「A」に文字通り一致する
  • D文字「D」に文字通り一致する
  • [0-5]0から5までの任意の文字に一致します
  • [0-9]0から9までの任意の文字に一致します
  • \.マッチ '。' 文字通り
  • m文字通り「m」に一致
  • a文字通り「a」に一致
  • t文字通り「t」に一致
  • $文字列の終わり

.*/[0-9]整数で始まるすべてのファイルを一致させたい場合は、それを分解して./12/test.tmp./12_not_a_mat_file.txt

于 2013-01-13T15:26:29.997 に答える
1

あなたの正規表現:(.*/\d+\w+[A][D][0-5][0-9]\.matあるべきではなく、ドットがないと単に「任意の文字」を意味するので^、ドットをエスケープすることを忘れないでください。.\

あなた[A][D][0-5][0-9]のパートが重要でなかったと仮定して、いつでもこれを試すことができます:.*/\d\w+\.mat

于 2013-01-13T15:14:57.697 に答える
1

使用しているetc表記は、perl(およびおそらく他の場所)からのものですが、コマンドライン\dではサポートされていません。bash

使用する必要があります

 ./[0-9][0-9][0-9][0-9][0-9]*

5桁+「その他」の値と一致させます。

前面の1-nの可能な数字を一致させる必要がある場合は、それらの可能性を「OR」する必要があります。ケースステートメントは、それを整理し、もう少し管理しやすくするのに役立ちます。

 case ${fileName} in
  ./[0-9][0-9][0-9][0-9]*|./[0-9][0-9][0-9][0-9][0-9]*) echo "4 or 5 nums at front" ;;
  ./[0-9]*|./[0-9][0-9]*|./[0-9][0-9][0-9]* ) echo "up to 3 nums at front" ;;
  #-------^-------------^--- note the '|' regex OR
 esac

短い一致は長い文字列にも一致するため、最初に長い一致をテストする必要があることに注意してください。

ニーズに応じて他の解決策もありますが、これはサブプロセスを開始する必要がないため、かなり効率的です。

IHTH

于 2013-01-13T15:15:17.067 に答える
1

十分に新しいbashを実行している場合は、exglobを使用して探しているものを表現できます。

shopt -s extglob
for f in ./+([0-9])*AD[0-5][0-9].mat; do
    # do something with "$f"
done

上記は再帰的検索ではないことに注意してください。bashのみの再帰的検索の場合、globstarもサポートするバージョンのbashが必要になります。

shopt -s extglob globstar
for f in ./**/+([0-9])*AD[0-5][0-9].mat; do
    # do something with "$f"
done

または、GNUfindの-regexオプションを使用して再帰検索を実行することもできます。

于 2013-01-13T15:52:32.630 に答える