だから私はこれをgrepの力を試すために使用しています。リソース
現在私が経験している問題は、期待どおりに動作しないようです。だから、次を含むデモ.txtファイルがあります。foo.txt、このコードを使用して検索しましたが
grep [a-z][a-z]o.txt demo.txt
空の結果が返されました。zsh: no matches found: [a-z][a-z]o.txt
私は角かっこの使い方の理解が間違っているかどうか知りたいです。
写真は次のとおりです。
答え1
に渡した正規表現を引用しなかったため、grep
シェルによって捕捉され、シェルはそれを拡張しようとします。今後電話してくださいgrep
。今使用した正規表現は、有効なシェルグローブモード1でもあります。これは、「現在のフォルダ内の名前が2文字の後に文字列が続くすべてのファイルまたはディレクトリを一覧表示します」o.txt
を意味します。現在のディレクトリにglobと一致するファイルまたはサブディレクトリが含まれている場合、globは一致するファイル名に展開されます。
$ ls
abo.txt demo.txt
$ cat demo.txt
foo.txt
$ set -x
$ grep [a-z][a-z]o.txt demo.txt
+zsh:7> grep abo.txt demo.txt
実行した実際のコマンドを表示してくださいset -x
。ご覧のとおり、zsh
一致する[a-z][a-z]o.txt
ファイル名に展開されます。abo.txt
それに渡された内容ですgrep
。
現在、ディレクトリに一致するファイル名がありません。これはzsh
、パターンが空の文字列に展開されるか、grep
まったく開始されないことを意味します。これがエラーの原因ですzsh: no matches found: [a-z][a-z]o.txt
。これは、globを一致するファイルに拡張できないことをzshに伝えます。
最後に、スキーマを正しく参照すると、次のような結果が得られます。
$ grep '[a-z][a-z]o.txt' demo.txt
+zsh:12> grep '[a-z][a-z]o.txt' demo.txt
foo.txt
今回は、引用符がパターンを渡すシェルからパターンを保護します。現状のままそしてこれを「2つの小文字、then、then」grep
を意味する正規表現として解釈します。grep
o
その他の文字そして、「で終わりますtxt
。これは正規表現で「すべての文字」を意味するので重要な詳細です.
。
grep '[a-z][a-z]o\.txt' demo.txt
「Escape \.
」を.
使用すると、文字通りの点だけが一致し、もはや「すべての文字」を意味しません。したがって、常に正規表現を引用して注意してください.
!
最後に、拡張正規表現を使用してこのコードを書くもう1つの方法は次のとおりです。
$ grep -E '[a-z]{2}o\.txt' demo.txt
foo.txt
1参照正規表現の定義は何ですか?globと正規表現の詳細。