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を付ける必要があります。