2010-06-09 18 views
16

Grep, regex ile hangi tür tırnakları çevrelediğime bağlı olarak farklı şekilde davranır. Bunun nedenini açık bir şekilde anlayamıyorum. Sadece tek/çift tırnak ile regex çevrelemek için bazı uygun bir yolu vardır varsayıyorumgrep kullanırken yapılan alıntılar?

hamiltont$ grep -e show\( test.txt 
    variable.show(); 
    variable.show(a); 
    variable.show(abc, 132); 
    variableshow(); 
hamiltont$ grep -e "show\(" test.txt 
grep: Unmatched (or \(
hamiltont$ grep -e 'show\(' test.txt 
grep: Unmatched (or \(

: İşte sorunun bir örnektir. Herhangi bir yardım?

FWIW, grep --version döner grep (GNU grep) 2.5.1

cevap

23

yürütülmeden önce kabuk tarafından işlenir argümanlar da dahil olmak üzere komut satırı. Sen yankı kullanabilirsiniz kabuk ne yaptığını görmek için: Yani

$ echo grep -e show\( test.txt 
grep -e show(test.txt 

$ echo grep -e "show\(" test.txt 
grep -e show\(test.txt 

$ echo grep -e 'show\(' test.txt 
grep -e show\(test.txt 

tırnak işareti olmadan ters eğik çizgi alır hale kaldırıldı "(" normal karakter grep için (grep varsayılan olarak temel regex kullanır, grep kullanımı genişletilmiş yapmak için -E kullanmak regex)

+0

Anladım, teşekkürler! – Hamy

+0

Hala tek ve çift tırnak işaretleri arasındaki farkın ne olduğunu anlamıyorum. Gönderdiğiniz örnekte, aynı şeyi yapıyorlar. –

+0

Tek bir alıntı veya çift tırnak işareti ile eşleşmesi gereken bir grep regexim varsa, grep ile nasıl yazabilirim? "grep" ["] \" "çalışmıyor ... – tonix

0

Ben farklı davranmadığı grep olduğuna inanmıyorum, bu kabuk. Sana

http://www.faqs.org/docs/bashman/bashref_8.html

Temelde alıntılanan versiyonları, eğik çizgi üzerinde farklı davranıyor alıntı mekanizmasına bağlı olan bash

kullandığınız varsayıyorum.

Alınan örneklerin ikisi de eğik çizgi olmadan çalışacaktı. İlki için, kabuk kaçmak (ve sadece model için grep için (göstermek içinde geçerdi.

2

Tırnak işaretleri grep'in gördüklerini değiştirir. Belirtilmemiş formdaki ters eğik çizgi (\), ters eğik çizgiden sonra karakterleri özel olarak ele alan kabuk tarafından işlenir. Bu, grep parametresi alınmadan önce gerçekleşir. grep gösterisi (. tek veya) çift tırnak (kullanıldığında, kabuk, "yalnız içeriğini bırakın" olarak yorumlar böylece grep grep anlamı var gösterisi \ ( ve \ ( karakterleri görür ve görür kapanış parantez aramaktadır - \)

BTW:. Tek ve çift tırnak elleçleme kabuk kabuk değişkenleri nasıl işleyeceğini farklıdır, ancak örnekte hiçbir kabuk değişken vardır amacıyla

+0

Anladım, teşekkürler! – Hamy

3

:

.
grep -e show(test.txt 

çalışmaz, çünkü kabuk ('u özel olarak, yalnızca bir karakter değil, parantez olarak yorumluyor ve kapanışı bulamıyor ).

Bu çalışma hem: kabuk sadece metin olarak alıntılanan metni davranır ve geçirir

grep -e 'show(' test.txt 
grep -e "show(" test.txt 

çünkü grep.Kabuk grep show\( geçer

grep -e 'show\(' test.txt 
grep -e "show\(" test.txt 

çünkü grep \( gibi özel bir parantez değil, sadece bir karakteri, görür ve kapanış \) bulamıyor:

Bunlar çalışmaz.