grep:角かっこを使用して特定の文字を一致させる

grep:角かっこを使用して特定の文字を一致させる

だから私はこれを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を意味する正規表現として解釈します。grepoその他の文字そして、「で終わります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と正規表現の詳細。

おすすめ記事