\ $ Grep tarafından nasıl yorumlanıyor?


Yanıtlar:


18

Kabuk uğratmaktadır \$gibi grep üzerine geçirilerek $satır karakter sonunda,. Hattınızın bir sonu olduğu varsayılarak, eşleşecek :-)

$Grep'teki bir gerçekle eşleşmek istiyorsanız , aşağıdakilerden birini kullanın:

grep \\\$
grep '\$'

İlkinde, kabuk verme \\olarak \ve \$olarak yorumlamaktadır . İkincisinde, hiç yorumlamaz.$\$


Neden \$iki karakter dizisi yerine dolar işareti ile eşleştiğine ilişkin sorunuzla ilgili olarak, grepbazı amaçlar için özel karakterler kullananlar gibi normal ifadeler . Bunlardan bazıları:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

diğerleri ile birlikte.

Normalde özel bir karakter olarak kabul edilen bir litre karakterini eşleştirmek istediğinizde grep, normal karakter olarak davranması için karakterden kaçmanız gerekir .


1
grep'in gördüklerini test etmek, denemek echo \$ve sonraecho \\$

Grep \\\ $ 'da, dediğin gibi \ $, grep'e iletilir, bu yüzden \ $ içeren dizelerle eşleşmelidir, ancak neden yalnızca $ içeren dizelerle eşleşiyor?

Çünkü grep içindeki $ satır sonu anlamına gelir. $ Karakterini eşleştirmek için, grep'e özel olarak davranmaması için kaçmanız gerekir. Güncellememe bakın.

@Pasi: yankı yapar bir kabuk yerleşik ya da değil, POSIX uyumlu ya da değil, var olmasına bağlı olarak kendi çıkış kaldırma, vb Daha İyi (IMHO) kullanmaktır ls \$ve biz "ls: $: Böyle bir dosya ya da dizin" olsun görüyoruz, \ $ 'ın $' dan kaçtığını, \\ $ \ \ $ \ \ \ $ \\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\ \ \ \ \ \ \ \ \ \\>
Temmuz'da Henno

5

Bu yorumlar kabuk önce programa parametre göndermeden önce çıkış sırasını genişleyen \$bir çıkış sırası olarak ve tek bir bağımsız değişken geçer $için grephattın sonuna eşleşir. Her satırın bir sonu olduğundan, herhangi bir satır eşleşmelidir :)


Ancak $ satır sonu nasıl? Satır sonu \ n değil mi?

2
@Happy Mithal: Bkz man grep. o karar verildi $bakılmaksızın çizgiler ile ayrılmış olup olmadığına, satırın sonuyla eşleşir \n, \rtamamen farklı, her ikisi ya da bir şey. Genel durumda, normal ifadeler yalnızca bir "çizgi" ile değil, herhangi bir dizeyle $eşleşmek için kullanılabilir ve dizenin sonuyla eşleşmek için kullanılır.

2

Satır sonu metakarakter olarak yorumlanıyor. Gerçek bir dolar işareti ile eşleşmek istiyorsanız,

 $ grep \\$ 

veya

 $ grep '\$' 

1

^dizenin başlangıcı ve $bitiş içindir.

grep \$

veya

grep $

her dizeyle eşleşir, böylece yazdığınız her şey tekrarlanır.

Deneyin

grep a$

Şimdi, yalnızca son karakteri olan dizeler aeşleştirilecek ve yankılanacaktır .


1

$Karakter sınıfı için normal ifadeyi kullanarak bir değişmez değer aramak istiyorsanız kaçma sorununu kaydedebilirsiniz . Örneğin,

$ grep '[$]' file
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.