-1

私はATMを学んgrepでいますが、クリーネ閉包のメタ文字の働きを理解するのに苦労しています。マニュアルページには、*前の文字と0回以上一致することが記載されています。test次の内容のファイルを使用しています

*a
123ab
1234
abcdef
a?
?

grep 'a*' test0個以上のオカレンスに一致する必要があり、説明されているように、出力のファイルaのすべての行を出力します。testこのドキュメントではさらに、メタ文字を一致させるには、メタ文字の*前に円記号を付けてエスケープする必要があると説明しています\。しかし、とからの出力grep '*' testgrep '\*' test同じです。出力:前に付けずに自分自身を照合するの*a はなぜですか?*\

4

2 に答える 2

3

*繰り返す前の項目がないため、それ自体は無効な正規表現です。この場合、grepの実装は、それをリテラルとして解釈し*ます。\*に一致する有効な正規表現です*。無効な正規表現*と有効な正規表現の実装による解釈は、\*たまたま同じです。

*との違いを本当に知りたい場合は、その\*前に項目を追加して、有効な正規表現で試してみてください。たとえば、リテラルa

grep 'a*'
grep 'a\*'

前者は*ゼロ文字に正常に一致する可能性があるため、すべてに一致します。後者は、a*文字通りを含む行にのみ一致します。

于 2013-01-08T06:47:42.893 に答える
3

正規表現の先頭は、 SUSv3のセクション9.3.3*に従って有効です。プラットフォームの正規表現インタープリターであるNarutoは、ここで正しいことを行っています。正規表現の先頭にあるときは、特殊文字ではありません。*

于 2013-01-08T17:34:27.620 に答える