Saya ingin melakukan grep \resources\
. Bagaimana saya melakukan ini?
Saya sudah mencoba:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Saya ingin melakukan grep \resources\
. Bagaimana saya melakukan ini?
Saya sudah mencoba:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Jawaban:
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 printf
bukan echo
karena banyak echo
implementasi juga melakukan interpretasi backslash mereka sendiri (di sini akan berkembang \b
menjadi 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\\bar
sebagai 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 "…"
.
Anda juga dapat menggunakan fgrep
(yang hanya grep
dengan -F
bendera). 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\'
..\
dan bahkan dengan '..\\'
saya tidak mendapatkan hasil yang saya inginkan. grep -F '..\'
mendapat apa yang saya inginkan! Terima kasih
grep
membutuhkan empat backslashes untuk mewakili garis miring terbalik:
grep "\\\\resources\\\\"
grep
hanya 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.
grep '\\resources\\'