*
私はgrepを介してメタ文字をテストするために単純なテキストファイルを使用しています。テキストファイルは次のとおりです。
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
grepを使って数字1を検索すると、次のようになります。
grep 1* regex.txt
出力は次のとおりです
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
文字「d」の場合でも、結果は赤色で強調表示された「d」と同じですが、文字「a」、「b」の場合は、次の検索コマンドは出力されません。
grep a* regex.txt
grep b* regex.txt
次のコマンドは、予想される出力を提供します。
grep "a*" regex.txt
grep "b*" regex.txt
なぜこれですか?bash
「a」と「b」より文字「d」が好ましい理由
答え1
これは引用されず、シェルによって拡張されるために発生しa*
ますb*
。今後たとえば、次のディレクトリを考えてgrep
みます。
$ ls
afile.txt bfile.txt regex.txt
実行しようとするとgrep a* regex.txt
検索モードにa*
変わります。 bashのデバッグオプション()を使用して、次のことを説明できます。afile.txt
grep
set -x
$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt
d
うまくいくがうまくいかないのa
は、b
現在のディレクトリに、およびで始まる名前のファイルまたはディレクトリがa
あるためです。b
そうしないと動作します。
$ ls
afile.txt bfile.txt regex.txt
$ grep a* regex.txt ## no output, it's searching for 'afile.txt'
$ rm afile.txt ## now there are no filenames starting with a
$ grep a* regex.txt
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
これを防ぐためにいつも検索パターンの引用:
grep "a*" regex.txt
または
grep 'a*' regex.txt