web-dev-qa-db-ja.com

grep "\\" XXFileのとき、 "Trailing Backslash"を取得しました

次に、「\」文字を含む行があるかどうかを確認します。私は試した grep "\\" XXFileしかし、それは「トレーリングバックスラッシュ」を示唆しています。しかし、私が試したときgrep '\\' XXFile OK。誰も最初のケースが実行できない理由を説明できますか?ありがとう。

58
dong

違いは、シェルがバックスラッシュを処理する方法にあります。

  • "\\"は二重引用符で囲まれ、シェルはバックスラッシュエスケープを解釈し、文字列\からgrepへ。 Grepは、その後に文字がないバックスラッシュを検出するため、「末尾のバックスラッシュ」警告を発します。二重引用符を使用する場合は、シェルとgrepの2つのレベルのエスケープを適用する必要があります。結果: "\\\\"

  • '\\'は一重引用符で囲まれ、シェルはnot解釈を行います。つまり、grepは文字列\\両方のバックスラッシュはそのまま。 Grepはこれをエスケープされたバックスラッシュとして解釈するため、ファイルでリテラルのバックスラッシュ文字を検索します。

それが明確でない場合は、echoを使用して、シェルが何をしているかを正確に確認できます。 echoはバックスラッシュの解釈を行わないため、表示されるのはシェルが渡したものです。

$ echo "\\"
\
$ echo '\\'
\\
101
John Kugelman

コマンドを次のように書くこともできます。

grep "\\\\" ...

これには、bashが2つの単一のバックスラッシュに変換する2組のバックスラッシュがあります。この新しいペアは、エスケープされたバックスラッシュとしてgrepに渡され、必要なものが取得されます。

4