İçinde nokta olan bir dizeyi aramak için grep kullanma


196

0.49Komutu kullanarak (nokta ile) bir dize aramaya çalışıyorum

grep -r "0.49" *

Ama olan şu ki 0449, 0949vs gibi dizeyi içeren istenmeyen sonuçlar alıyorum . Şey, linux'un herhangi bir karakter olarak dot (.) Olduğunu düşünüp tüm sonuçları ortaya çıkarmasıdır. Ama sonucu sadece "0.49" için almak istiyorum.

Yanıtlar:


238

grepregexes kullanır; .normal ifadedeki "herhangi bir karakter" anlamına gelir. Değişmez bir dize istiyorsanız, kullanmak grep -F, fgrepya da kaçmaya .için\. .

Dizenizi çift tırnak içine almayı unutmayın. Yoksa kullanmalısın\\.

Yani, komutunuzun olması gerekir:

grep -r "0\.49" *

veya

grep -r 0\\.49 *

veya

grep -Fr 0.49 *

58
\\.Çalışması için iki kez kaçmam gerekiyordu . Zsh kullanıyorum.
Nikos Renieris

5
@NikosRenieris, selamlayan dizenizi çift tırnak işareti ile mi sardınız?
Justus Romijn

Sanırım yaptım, evet.
Nikos Renieris

15
Kullanmak gerekecektir \\.çok partisi yüzünden veya kullanmak "\."kabuğundan kaçmak için.
Tomofumi

36

grep -F -r '0.49' *0.49'a normal ifade yerine "sabit" bir dize olarak davranır. Bu .özel anlamını yitirir.


22

.As kaçmak gerekir"0\.49" .

A ., herhangi bir karakterle (yeni satır hariç) eşleşecek bir normal ifade meta karakteridir. Bir gerçek dönemi eşleştirmek için, kaçmanız gerekir.



5

Ayrıca kullanabilirsiniz "[.]"

grep -r "0[.]49"

5

Burada noktadan kaçmayı öneren birçok cevap var \.ama tekrar tekrar bu konuya giriyorum: \.bana aynı sonucu veriyor.

Ancak, bu iki ifade benim için çalışıyor:

$ grep -r 0\\.49 *

Ve:

$ grep -r 0[.]49 *

Ubuntu ve Archlinux'da "normal" bir bash kabuğu kullanıyorum.

Düzenleme, ya, yorumlara göre:

$ grep -r '0\.49' *

Not, tek tırnak burada fark yapıyor.


3
Regex'i kabuktan alıntılamanız veya ters eğik çizgiden kaçmanız gerekir; grep '\.'veya grep \\.(birincisini şiddetle tavsiye ediyorum. Çift tırnaklar da orijinal sorudaki gibi çalışır; ancak tek tırnakların anlaşılması ve kullanımı daha kolaydır. Örneğin, çift tırnaklarla, bazı senaryolarda ters eğik çizgiyi iki katına çıkarmanız gerekir. ).
tripleee

IMHO, bu en açık doğru cevap, @tripleee'nin yorumu ile en eksiksiz. [] (tek bir karakterle eşleşecek bir karakter alt kümesini temsil eden işlevler) kullanımı hoş bir hack'tir.
jringoot

@jringoot Cidden mi? Sanırım bu hiç de net değil - daha çok alıntıya aşina olmayan birinden gelen bir takip sorusuna benziyor.
tripleee

Açıktır, çünkü her iki ifade doğrudan çalışır ve gerçekten de birçok kişi alıntıyı üstlenir veya kabuğun önemsiz olarak ikincil yorumundan kaçınmak için iki kez kaçması gerekir. Artık yorumu değiştiremiyorum (5 dakika sınırı). Benim yorum daha iyi olabilirdi: "bu, @tripleee yorum ile birlikte en eksiksiz cevaptır. Çünkü her iki komut hemen çalışır ve alıntı ile tamamlandı"
jringoot

1
Genellikle önerdiğim "her zaman düzenli ifadelerinizi tek tırnakla". Bu "tam değil" ama işi bitiriyor ve ya alıntıyı anlamanız ya da bu basit kural tarafından yaşamanız gerektiği anlamına geliyor.
Üçlü

4

Kaçış noktası. Örnek komut olacaktır.

grep '0\.00'

4

Nokta ve diğer özel karakterlerden \

Örneğin. grep -r "0 \ .49"


Gelecekteki okuyucu için bir hatırlatma, \.tırnaklarla çevrelemek için çalışması gerekir.
Meyve

1

Temelde tüm özel karakterleri yok sayan ve grep tarafından yorumlanmayacak olan - seçeneğiyle de arama yapabilirsiniz.

$ cat foo |grep -- "0\.49"
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.