Normal bir ifade olarak grep


96

Bir PHP değişkeni aramam gerekiyor $someVar. Ancak Grep bir normal ifade çalıştırmaya çalıştığımı düşünüyor ve şikayet ediyor:

$ 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">>

Ben grep söylediği için bir seçenek görmüyorum değil bir regex olarak dize yorumlamak, ancak dahil etmek $sadece başka bir dize karakter olarak.


3
Bu soruda asıl mesele, normal ifade olarak grepyorumlamakla ilgili değil $. Bu, kabuğun $someVarortam değişkeninin değeriyle someVar, muhtemelen boş dizeyle değiştirilmesiyle ilgilidir. İkinci örnek, tüm satırları içeren tüm satırları döndürmemelidir someVar, çünkü boş dize tüm satırlardadır. Kabuğun yerine geçmemesini söylemek için '$someVar'veya kullanmanız gerekir \$someVar. O zaman karakterin grepyorumuyla uğraşmanız gerekecek $.
Christophe Drevet-Droguet

1
@ ChristopheDrevet-Droguet: Açıklama için teşekkür ederim, olumsuz oy konusunda şaşkınım! Yorumunuz bir cevap olacak kadar bilgilendirici, aslında öyleyse sayfadaki daha iyi cevaplardan biri olacaktır.
dotancohen

Yanıtlar:



299

Kullan fgrep(kullanımdan kaldırıldı) grep -Fveyagrep --fixed-strings , kalıbı bir normal ifade yerine sabit dizeler listesi olarak değerlendirmesini sağlamak için kullanın.

Referans için dokümantasyondan (alıntılar) bahsedilir:

-F --fixed-stringsDeseni, herhangi biri eşleşecek olan yeni satırlarla ayrılmış sabit dizeler listesi (normal ifadeler yerine) olarak yorumlayın. (-F, POSIX tarafından belirtilir.)

fgrepile aynıdır grep -F. Fgrep olarak doğrudan çağrı kullanımdan kaldırılmıştır, ancak bunlara dayanan geçmiş uygulamaların değiştirilmeden çalışmasına izin vermek için sağlanmıştır.

Tam referans için şu adrese bakın: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


basit harika cevap.
breadmj

Kabul edildi - değişkenleri kullanırken addslashes(), bash'da PHP'ye benzer bir şey yapamazsınız . Bunu yapmanın en basit yolu budur.
geerlingguy

1
Teşekkür ederim, bu işe yaradı. Hatırlatma: Çift tırnak kullanıyorsanız, yine de kaçmanız$ gerekecek , örneğin: grep -FR "unset(\$foo['bar'])"aksi halde bunun harici bir değişken olduğunu düşünür ve genişletmeye çalışır
aexl

57

grep -Fgrepargümanı bir model değil, sabit bir dizge olarak yorumlamayı söylemenin standart bir yoludur .


1
Cidden, bu kabul edilen cevap olmalıydı!
ankush981

Güzel cevap. $ İle ssh komutunu kullanarak bir dizge aradığımda sorunumu çözdü. Bu senaryoda "\" ile kaçmak işe yaramadı. Ama -F bayrağı hile yaptı.
Rajasekhar

8

Grep'e '-F' kullanarak bir kalıp yerine sabit bir dizge kullandığınızı söylemelisiniz:

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

3

Bu soruda asıl mesele, normal ifade olarak grepyorumlamakla ilgili değil $. Bu $someVar, ortam değişkeninin değerini someVar, muhtemelen boş dizeyi kullanan kabukla ilgilidir .

Yani ilk örnekte, grepherhangi bir argüman olmadan aramak gibi ve bu yüzden size bir usageçıktı veriyor . İkinci örnek, tüm satırları içeren tüm satırları döndürmemelidir someVar, çünkü boş dize tüm satırlardadır.

Kabuğun yerine geçmemesini söylemek için '$someVar'veya kullanmanız gerekir \$someVar. O zaman $karakterin grep yorumuyla uğraşmanız gerekecek , bu nedenle grep -Fdiğer birçok cevapta verilen seçenek.

Dolayısıyla geçerli bir cevap şu olacaktır:

grep -ir "Something Here" * | grep '$someVar'

2

-FSeçenek için +1 , kabul edilen cevap olacaktır. Ayrıca, -I..dosyalarımda kalıbı ararken "garip" bir davranışla karşılaştım , çünkü -Iseçeneği olarak grep; bu tür hatalardan kaçınmak için komutun argümanlarının sonunu kullanarak açıkça belirtebiliriz --.

Misal:

grep -HnrF -- <pattern> <files>

Umarım bu birine yardımcı olur.


F ne anlama geliyor?
Arnold Roa

Gönderen gnu.org/software/grep/manual/grep.html : "-F:. (Yerine düzenli ifadeler) sabit dizeleri listesi gibi desen yorumlayın, eşleştirilecek herhangi biri satırbaşıyla, ayrılmış (-F POSIX tarafından belirtilir.) "
Aloïké Go

Eğer --kullanılırsa, olabilir -HnrFatlanabilir?
Daniel

@Daniel Ne yapmak istediğinize bağlıdır: -Fkalıbı normal bir ifade olarak yorumlamaktan kaçınırken , --onu takip eden öğeleri grep seçenekleri olarak yorumlamaktan kaçınır.
Aloïké Go

@ AloïkéGo Teşekkürler, anladım.
Daniel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.