これを実行しているとき
echo 'a\\b' | grep '\\'
バックスラッシュを正しく識別します
しかし、二重引用符を使用すると
echo 'a\\b' | grep "\\"
実行されておらず、末尾のバックラッシュ エラーが返されています。なぜそれが起こるのかわかりません。バックスラッシュをエスケープしたため、単一引用符とまったく同じように機能するはずです。
二重引用符を使用すると、\\
はに評価され\
ます。一重引用符はそのままにしておきます。私がecho "\\"
何を意味するかを見るためにやってください。
バックスラッシュのエスケープを処理できる場所は複数あります。
"\n"
は機能しないことに注意してください。これは、エコーを実行すると最初の引数として取得され、実行するとエコーが最初の引数としてecho "a\\b"
取得されることを意味します。a\b
echo 'a\\b'
a\\b
grep
、入力を独自のエスケープセットを持つ POSIX 正規表現として解析します。echo
デフォルトでエスケープコードを処理する場合としない場合があります。私/bin/echo
はデフォルトでエスケープコードを処理しません。私のbash
ビルトインecho
も処理しませんが、zsh
ビルトインは処理しますecho
。特定の動作が必要な場合は、 で指定し-e
てエスケープを有効にするか、 でエスケープ-E
を無効にすることができます。grep "\\"
そのため、シェルを呼び出している場合、\\
エスケープ シーケンスを処理し\
て grep に渡します。grep はそれを正規表現として解析しようとしますが、末尾のバックスラッシュについて正確に文句を言います。
したがって、二重引用符を使用する場合は、すべてを二重にエスケープする必要があり、かなり不器用になりecho 'a\\b' | grep "\\\\"
ます。
エスケープの量を最小限に抑えるには、echo 'a\\b' | grep '\\'
またはを使用できますecho 'a\\b' | grep -F '\'
。ここで、-F
フラグは grep にパターンを正規表現ではなく逐語的な文字列として解釈するように指示します。デフォルトで を処理するがたまたまecho
エスケープした場合 (これにより print がecho 'a\\b'
発生します) 、コマンドa\b
に追加する必要もあります。-E
echo
grepは、基本的な正規表現のマッチングを少し行います。
二重引用符で囲む場合、シェルはを解析する\\
ため\\
、パラメーターとして単一の円記号に解決されます。
さらに、grepは基本的な正規表現のマッチングを少し行うため、1つのバックスラッシュを一致させるには、2つのバックスラッシュをgrepに渡す必要があります。
したがって、呼び出すgrep "\\"
ことにより、実際にgetを取得しますgrep \
。これは正規表現として解析されないため、grepは失敗します。
二重の円記号のみを正しく一致grep -F '\\'
させるには、(正規表現ではなく文字列の一致を固定することを意味します)、grep '\\\\'
またはを実行しgrep "\\\\\\\\"
ます。