grep検索で引用符を使用するヘルプ

grep検索で引用符を使用するヘルプ

a(i)%b(j)%c 形式の変数を含むファイルがあります。ここで、a、b、cは常に同じですが、インデックスiとjは異なる場合があります(複数の文字を含む)。そのため、grepを使用してこれらの変数のインスタンスを検索しようとしていますが、成功するかどうかは検索文字列の周りに引用符を含めるかどうかによって異なり、違いがある理由を理解しようとしています。単一文字インデックスから検索を開始する場合:

(1)grep a\(.\)\%b\(.\)\%c file 期待通りに動作します

(2)grep 'a\(.\)\%b\(.\)\%c' file 一致しない

(3)grep "a\(.\)\%b\(.\)\%c" file 一致しない

それから(もっと混乱させるために!)複数文字のインデックス付けの可能性を含めました。

(4)grep a\(.*\)\%b\(.*\)\%c file 動作しません。 - zsh:一致するものが見つかりませんでした:a(。)%比(。)%さん

(5)grep 'a\(.*\)\%b\(.*\)\%c' file 作品

(6)grep "a\(.*\)\%b\(.*\)\%c" file 作品

それぞれの場合に何が起こっているのかを説明できる人はいますか? (4)の場合、アスタリスクのためにシェル(zsh)が他のことをしているように見えますが、実際に何をしているのかわかりません。特に、(1)、(5)、(6)は動作しますが、(2)と(3)は動作しない理由が何であるか混乱しています。

ありがとうございます!

答え1

シェルエスケープとエスケープを区別する必要がありますgrep

デフォルトの正規表現(BRE;grepオプションなしで使用される場合は使用-E)とを(通常の文字として扱います。シーケンスは特別な意味を持ちます。)|\(\|

引用符がない場合、シェルはバックスラッシュをエスケープ文字として処理して削除します。つまり、grep表示されません。引用符を使用するとバックスラッシュが表示されるため、およびgrepの意味が変わります。(|

拡張正規表現(grep -E)の場合、その逆が適用されます。(|は特別なので、通常の文字として扱うには、前にbashslashを付ける必要があります。

関連情報