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


23

のgrepを行いたい\resources\。どうすればいいですか?

私はもう試した:

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

これらはどれも機能しません


5
バックスラッシュのbashの解釈を避けるために、二重引用符の代わりに単一引用符を使用します。 grep '\\resources\\'
ポールトムブリン

回答:


27

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

  • シェルを含む:可能であれば単一引用符を使用して、別のバックスラッシュを使用するか、よりエレガントにエスケープする必要があります。

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

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

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

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

    grep 'foo\\bar'
    

    または同等に:

    grep foo\\\\bar
    

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

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


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


18

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

grep -F '\resources\'

フラグには理由があります!私はをgrepしようとしていた..\とも、と'..\\'私は私が望んでいた結果を取得できませんでした。grep -F '..\'欲しいものを手に入れた!ありがとう
FreeSoftwareServers

..そのコメントを正しくフォーマットしてみてください!- > meta.stackexchange.com/questions/201663/...
FreeSoftwareServers

3

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

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

12
これは、かなり誤解を招く過剰な単純化です。 grep別のバックスラッシュをエスケープするためにバックスラッシュを1つだけ必要としますが、シェルではバックスラッシュを引用符で囲む必要があります。二重引用符(")はバックスラッシュを引用しませんが、バックスラッシュは引用します。そのため、例の二重引用符は何もせず、代わりに4つのバックスラッシュが必要です。
jw013

Windowsのコマンドプロンプトは* nixのようにバックスラッシュを処理しませんが、Windowsでは4つのバックスラッシュを使用する必要がありました。場合、私は疑問に思うGnuWinのポートは、それが必要でいたものだと思っ、シェルの効果とハードコーディングされた4 -スラッシュ要件を誤解しましたgrep
Synetech
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.