web-dev-qa-db-ja.com

grep:末尾のバックスラッシュ

\resources\のgrepを実行します。どうすればよいですか?

私はもう試した:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

これらの作業のどれも

26
Tom Medley

バックスラッシュは多くのアプリケーションにとって特別な文字です:

  • シェルを含む:single引用符を使用して、別のバックスラッシュまたはよりエレガントにエスケープする必要があります:

    $ printf '%s\n' foo\\bar 'foo\bar'
    foo\bar
    foo\bar
    

    ここで、コマンドは値foo\barの2つの引数を受け取りました。これらはそのまま端末にエコーされました。

    (上記では、printfの代わりにechoを使用しました。多くのecho実装も独自にバックスラッシュを解釈します(ここでは\bをバックスペース文字に展開します)) 。

  • ただし、バックスラッシュはgrepの特殊文字でもあります。このコマンドは、\(\|\.などの多くの特別なシーケンスを認識します。そのため、同様に、実際のバックスラッシュ文字に対して、grepに二重の\\を与える必要があります。つまり、シェルを使用して次のように入力する必要があります。

    grep 'foo\\bar'
    

    または同等:

    grep foo\\\\bar
    

    (両方の行は、シェルにgrepへの引数としてfoo\\barを送信するように指示します)。

  • 他の多くのコマンドは、引数の一部でバックスラッシュを解釈します...そして、2つのレベルのエスケープが必要です(1つはシェルの解釈をエスケープするため、もう1つはコマンドの解釈をエスケープするため)。


ちなみに、シェルの場合、単一引用符'…'はあらゆる種類の文字解釈を防止しますが、二重引用符はそれらの一部のみを防止します。特に$`および\"…"内のアクティブな文字のままにします。

28

fgrep-Fフラグを付けたgrepのみ)を使用することもできます。これにより、grepはパターンを固定文字列として解釈します(つまり、\をリテラル\として扱います)。シェルによる拡張からバックスラッシュを保護する必要があります。

grep -F '\resources\'
20
mills013

grepには、バックスラッシュを表すfourバックスラッシュが必要です。

grep "\\\\resources\\\\"
3
Tom Medley