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.
grep
menafsirkan$
sebagai regex. Ini tentang shell yang menggantikan$someVar
nilai variabel lingkungansomeVar
, kemungkinan string kosong. Contoh kedua seharusnya tidak mengembalikan semua baris dengansomeVar
tetapi 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 dengangrep
interpretasi$
karakter.Jawaban:
Kabur
$
dengan meletakkan\
di depannya.sumber
Gunakan
fgrep
(tidak digunakan lagi),grep -F
ataugrep --fixed-strings
, untuk membuatnya memperlakukan pola sebagai daftar string tetap, bukan regex.Sebagai referensi, dokumentasi menyebutkan (kutipan):
Untuk referensi lengkap, periksa: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html
sumber
addslashes()
di bash. Ini adalah cara termudah untuk melakukannya.$
, misalnyagrep -FR "unset(\$foo['bar'])"
grep -F
adalah cara standar untuk memberitahugrep
untuk menafsirkan argumen sebagai string tetap, bukan pola.sumber
Anda harus memberi tahu grep bahwa Anda menggunakan string tetap, bukan pola, menggunakan '-F':
sumber
Dalam pertanyaan ini, masalah utamanya bukanlah tentang
grep
menafsirkan$
sebagai regex. Ini tentang shell yang menggantikan$someVar
nilai variabel lingkungansomeVar
, kemungkinan string kosong.Jadi pada contoh pertama, ini seperti menelepon
grep
tanpa argumen apa pun, dan itulah mengapa ini memberi Andausage
keluaran. Contoh kedua seharusnya tidak mengembalikan semua baris yang berisisomeVar
tetapi 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 itugrep -F
opsi diberikan dalam banyak jawaban lain.Jadi satu jawaban yang valid adalah:
sumber
1 untuk
-F
opsi, itu akan menjadi jawaban yang diterima. Juga, saya memiliki perilaku "aneh" saat mencari-I..
pola di file saya, karena-I
dianggap sebagai opsigrep
; untuk menghindari kesalahan semacam itu, kita dapat secara eksplisit menentukan akhir dari argumen perintah menggunakan--
.Contoh:
Semoga itu bisa membantu seseorang.
sumber
--
digunakan, dapatkah-HnrF
dihilangkan?-F
menghindari menafsirkan pola sebagai ekspresi reguler, sedangkan--
menghindari menafsirkan elemen yang mengikutinya sebagai opsi grep.