Grep bukan sebagai ekspresi reguler

96

Saya perlu mencari variabel PHP $someVar. Namun, Grep berpikir bahwa saya mencoba menjalankan regex dan mengeluh:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

Saya tidak melihat opsi untuk memberi tahu grep agar tidak menafsirkan string sebagai regex, tetapi menyertakan $hanya sebagai karakter string lain.

dotancohen
sumber
3
Dalam pertanyaan ini, masalah utamanya bukanlah tentang grepmenafsirkan $sebagai regex. Ini tentang shell yang menggantikan $someVarnilai variabel lingkungan someVar, kemungkinan string kosong. Contoh kedua seharusnya tidak mengembalikan semua baris dengan someVartetapi semua baris, karena string kosong ada di semua baris. Untuk memberi tahu cangkang agar tidak menggantikan, Anda harus menggunakan '$someVar'atau \$someVar. Kemudian Anda harus berurusan dengan grepinterpretasi $karakter.
Christophe Drevet-Droguet
1
@ ChristopheDrevet-Droguet: Terima kasih atas penjelasannya, saya bingung untuk downvote-nya! Komentar Anda cukup informatif untuk menjadi sebuah jawaban, bahkan itu akan menjadi salah satu jawaban yang lebih baik di halaman tersebut jika demikian.
dotancohen

Jawaban:

-8

Kabur $dengan meletakkan \di depannya.

Tuan Lister
sumber
299

Gunakan fgrep(tidak digunakan lagi), grep -Fatau grep --fixed-strings, untuk membuatnya memperlakukan pola sebagai daftar string tetap, bukan regex.

Sebagai referensi, dokumentasi menyebutkan (kutipan):

-F --fixed-stringsTafsirkan pola sebagai daftar string tetap (bukan ekspresi reguler), dipisahkan oleh baris baru, yang mana saja akan dicocokkan. (-F ditentukan oleh POSIX.)

fgrepsama dengan grep -F. Pemanggilan langsung sebagai fgrep tidak digunakan lagi, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung padanya untuk berjalan tanpa modifikasi.

Untuk referensi lengkap, periksa: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

Hasturkun
sumber
jawaban bagus sederhana.
breadmj
Setuju — saat Anda menggunakan variabel, Anda tidak dapat melakukan sesuatu seperti PHP addslashes()di bash. Ini adalah cara termudah untuk melakukannya.
Geerlingguy
1
Terima kasih, ini berhasil. Pengingat: jika menggunakan tanda kutip ganda, Anda masih harus keluar dari$ , misalnya grep -FR "unset(\$foo['bar'])"
:,
57

grep -Fadalah cara standar untuk memberitahu grepuntuk menafsirkan argumen sebagai string tetap, bukan pola.

rkhayrov
sumber
1
Serius, ini seharusnya jawaban yang diterima!
ankush981
Jawaban bagus. Ini memecahkan masalah saya ketika saya mencari string dengan $ menggunakan perintah ssh. Melarikan diri dengan "\" tidak berhasil dalam skenario itu. Tapi -F flag berhasil.
Rajasekhar
8

Anda harus memberi tahu grep bahwa Anda menggunakan string tetap, bukan pola, menggunakan '-F':

grep -ir "Something Here" * | grep -F \$somevar
huelbois
sumber
3

Dalam pertanyaan ini, masalah utamanya bukanlah tentang grepmenafsirkan $sebagai regex. Ini tentang shell yang menggantikan $someVarnilai variabel lingkungan someVar, kemungkinan string kosong.

Jadi pada contoh pertama, ini seperti menelepon greptanpa argumen apa pun, dan itulah mengapa ini memberi Anda usagekeluaran. Contoh kedua seharusnya tidak mengembalikan semua baris yang berisi someVartetapi semua baris, karena string kosong ada di semua baris.

Untuk memberi tahu cangkang agar tidak menggantikan, Anda harus menggunakan '$someVar'atau \$someVar. Maka Anda harus berurusan dengan interpretasi grep dari $karakter tersebut, oleh karena itu grep -Fopsi diberikan dalam banyak jawaban lain.

Jadi satu jawaban yang valid adalah:

grep -ir "Something Here" * | grep '$someVar'
Christophe Drevet-Droguet
sumber
2

1 untuk -Fopsi, itu akan menjadi jawaban yang diterima. Juga, saya memiliki perilaku "aneh" saat mencari -I..pola di file saya, karena -Idianggap sebagai opsi grep; untuk menghindari kesalahan semacam itu, kita dapat secara eksplisit menentukan akhir dari argumen perintah menggunakan --.

Contoh:

grep -HnrF -- <pattern> <files>

Semoga itu bisa membantu seseorang.

Aloïké Go
sumber
apa kepanjangan dari F?
Arnold Roa
Dari gnu.org/software/grep/manual/grep.html : "-F: Menafsirkan pola sebagai daftar string tetap (bukan ekspresi reguler), dipisahkan oleh baris baru, yang mana saja akan dicocokkan. (-F ditentukan oleh POSIX.) "
Aloïké Go
Jika --digunakan, dapatkah -HnrFdihilangkan?
Daniel
@Daniel Itu tergantung pada apa yang ingin Anda lakukan: -Fmenghindari menafsirkan pola sebagai ekspresi reguler, sedangkan --menghindari menafsirkan elemen yang mengikutinya sebagai opsi grep.
Aloïké Go
@ AloïkéGo Terima kasih, saya mengerti.
Daniel