grep ve bir dolar işareti kaçan


31

Hangi dosyaların dizeye sahip olduğunu bilmek istiyorum $Id$.

grep \$Id\$  my_dir/mylist_of_files

0 oluşumları döndürür.

Kullanmam gerektiğini keşfettim

grep \$Id$ my_dir/mylist_of_files

Sonra $Idçıktıda renkli olduğunu , yani eşleştiğini görüyorum .

İkinciyi nasıl eşleştirebilirim $ve neden çalışmıyor \$Id\$?

İkincisinin $son karakter olup olmaması önemli değil.

Kullandığım grep2.9.


Sorumu göndermeden önce google ... kullandım

Bir cevap buldum

Test2 adlı dosyada bir $ (dolar işareti) aramak için, şunu girin:

grep \\ $ test2

Kabuğun grep komutuna bir \ $ (tek ters eğik çizgi, dolar işareti) geçmesi için \\ (çift ters eğik çizgi) karakterleri gerekir. \ (Single backslash) karakteri, grep komutuna aşağıdaki karakteri (bu örnekte $) bir ifade karakteri yerine değişmez bir karakter olarak ele almasını söyler. Ters eğik çizgi gibi kaçış karakterleri kullanma zorunluluğunu önlemek için fgrep komutunu kullanın.

ama neden grep \$Idişe yaradığını ve neden işe grep \\$Id\\$yaramadığını anlamıyorum.

Biraz kafam karıştı...

Yanıtlar:


25

Burada 2 ayrı konu var.

  1. grepTemel Normal İfadeler (BRE) kullanır ve $BRE'lerde yalnızca ifadenin sonunda özel bir karakterdir. Bunun sonucu, 2 örneklerini olmasıdır $olarak $Id$eşit değildir. Birincisi normal bir karakter, ikincisi çizginin sonuna uyan bir çapadır. İkinci $maçı tam anlamıyla yapmak $için ters eğik çizgiden kaçmanız gerekir, yani $Id\$. İlkinden kaçmak $da işe yarıyor: \$Id\$ve bunu daha tutarlı göründüğü için tercih ediyorum.

  2. Burada işte tamamen ilgisiz kaçma / alıntılama mekanizmaları vardır: kabuk alıntılama ve regex ters eğik alıntılama. Sorun, normal ifadelerin kullandığı birçok karakterin kabuk için de özel olması ve bunun üzerine regex kaçış karakterinin, ters eğik çizginin de bir kabuk alıntı karakteri olması. Bu nedenle, sıkça çift ters eğik çizgi içeren karışıklıklar görüyorsunuz, ancak çok okunaklı olmadığından kabuk ifadelerinden alıntı yapmak için ters eğik çizgi kullanmanızı önermiyorum.

    Bunun yerine, bunu yapmanın en basit yolu, önce tüm regex'inizi olduğu gibi tek tırnak içine koymaktır 'regex'. Tek alıntı, kablonun en güçlü alıntı şeklidir, bu nedenle regex'iniz tek tırnak içermediği sürece, kabuk alıntılama konusunda endişelenmenize gerek kalmaz ve saf BRE sözdizimine odaklanabilirsiniz.

Öyleyse, bunu tekrar orjinal örneğinize uygulayarak, doğru regex'i (\$Id\$ ) tekli tırnak içine . Aşağıdaki istediğinizi yapmalıdır:

grep '\$Id\$' my_dir/my_file

Bunun sebebi \$Id\$işe yaramaz çünkü kabuk alıntıların kaldırılmasından sonra (kabuk alıntı demenin daha doğru bir yolu), grepgördüğü regex $Id$. (1) 'de açıklandığı gibi, bu regex değişmez bir eşleşir.$Id sadece satırın sonundaki , çünkü $ikincisi özel, ikincisi ise özel bir tutturucu karakterdir.

Also Ayrıca Genişletilmiş Normal İfadelere (ERE) geçerseniz, örneğin kullanmaya karar verirseniz egrep(veya grep -E), $karakterin her zaman özel olduğunu unutmayın. ERE'de $Id$hiçbir zaman bir şeyle eşleşmeyecektir, çünkü satır sonundan sonra karakteriniz olamaz , bu yüzden \$Id\$gitmek için tek yol bu olacaktır.


3
Grep'in ilk parametresini normal ifade olarak yorumlamasını önlemek için, bunu da yapabilirsiniz grep -F '$Id$'.
jfg956

Kabuğumda (bash 4.3.42) grep '$Id\$' ...ve grep \$Id\\$ ...işim
nitsas,

2
Bu komut bir makefile eğer, siz de kaçmak gerekir $bir önceki ile $: grep '$$Id\$$'. stackoverflow.com/a/2382810/2097284
Camille Goudeseune,

-2

$Id$Bir dosyayı aramak için : şunları kullanabilirsiniz:grep '\$id*' filename


2
Bu her şeyden önce başlayacak $id, $ideaörneğin sadece değil $id$.
terdon
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.