grep: Trailing backslash

23

Saya ingin melakukan grep \resources\. Bagaimana saya melakukan ini?

Saya sudah mencoba:

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

Tak satu pun dari ini bekerja .

Tom Medley
sumber
5
Gunakan tanda kutip tunggal sebagai ganti tanda kutip ganda untuk menghindari interpretasi bash tentang garis miring terbalik. grep '\\resources\\'
Paul Tomblin

Jawaban:

27

Backslash adalah karakter khusus untuk banyak aplikasi:

  • termasuk shell: Anda perlu menghindarinya menggunakan backslash lain atau lebih elegan, menggunakan tanda kutip tunggal jika mungkin:

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

    Di sini perintah menerima dua argumen dengan nilai foo\bar, yang digemakan apa adanya di terminal.

    (Di atas, saya menggunakan printfbukan echokarena banyak echoimplementasi juga melakukan interpretasi backslash mereka sendiri (di sini akan berkembang \bmenjadi karakter backspace)).

  • Tetapi backslash juga merupakan karakter khusus untuk grep. Perintah ini mengakui banyak urutan khusus seperti \(, \|, \., dan sebagainya. Jadi, Anda juga perlu memberi makan grep dengan double \\untuk karakter backslash yang sebenarnya. Ini berarti menggunakan shell Anda perlu mengetik:

    grep 'foo\\bar'
    

    atau yang setara:

    grep foo\\\\bar
    

    (kedua baris memberitahu shell untuk mengirimkan foo\\barsebagai argumen untuk grep).

  • Banyak perintah lain menafsirkan garis miring terbalik dalam beberapa argumen mereka ... dan diperlukan dua tingkat pelarian (satu untuk menghindari interpretasi shell, satu untuk melarikan diri dari interpretasi perintah).


Ngomong-ngomong, untuk shell, tanda kutip tunggal '…'mencegah segala jenis interpretasi karakter, tetapi tanda kutip ganda hanya mencegah beberapa di antaranya: khususnya $, `dan \tetap karakter aktif di dalamnya "…".

Stéphane Gimenez
sumber
18

Anda juga dapat menggunakan fgrep(yang hanya grepdengan -Fbendera). Ini memaksa grep untuk menginterpretasikan pola sebagai string yang tetap (yaitu akan memperlakukan \sebagai literal \). Anda masih harus melindungi backslash dari ekspansi oleh shell.

grep -F '\resources\'
mills013
sumber
Bendera yang ada karena suatu alasan! Saya mencoba untuk menerima ..\dan bahkan dengan '..\\'saya tidak mendapatkan hasil yang saya inginkan. grep -F '..\'mendapat apa yang saya inginkan! Terima kasih
FreeSoftwareServers
.. Coba format komentar itu benar! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers
3

grepmembutuhkan empat backslashes untuk mewakili garis miring terbalik:

grep "\\\\resources\\\\"
Tom Medley
sumber
12
Ini adalah penyederhanaan yang agak menyesatkan. grephanya membutuhkan 1 backslash untuk keluar dari backslash lain, tetapi shell juga membutuhkan backslash untuk dikutip. Kutipan ganda ( ") JANGAN mengutip backslash, tetapi backslash tidak, itulah sebabnya tanda kutip ganda dalam contoh Anda tidak melakukan apa pun dan 4 backslash diperlukan.
jw013
Saya harus menggunakan empat backslash di Windows meskipun command-prompt Windows tidak memperlakukan backslash seperti * nix. Saya ingin tahu apakah port GnuWin salah mengerti efek shell dan mengkodekan persyaratan 4-slash, mengira itu adalah apa yang diperlukan oleh grep.
Synetech