2010-06-09 28 views
16

Grep funziona in modo diverso a seconda del tipo di virgolette che racchiude la regex. Non riesco a capire chiaramente perché sia ​​così. Ecco un esempio del problema:Citazioni quando si utilizza grep?

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 \(

sto solo presumere che vi sia un modo corretto di racchiudere l'espressione regolare con le doppie virgolette singole /. Qualsiasi aiuto?

FWIW, grep --version rendimenti grep (GNU grep) 2.5.1

risposta

23

La riga di comando che include gli argomenti viene elaborata dalla shell prima che venga eseguita. È possibile utilizzare echo per vedere che cosa la shell fa:

$ 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 

Quindi, senza le virgolette il backslash viene rimosso rendendo la "(" un carattere normale per grep (grep utilizza base regex per impostazione predefinita, utilizzare -E a fare uso grep esteso regex).

+0

Capito, grazie! – Hamy

+0

Ancora non capisco quale sia la differenza tra virgolette singole e doppie. Nell'esempio che hai pubblicato, sembrano fare la stessa cosa. –

+0

Cosa succede se ho una regex di grep che dovrebbe corrispondere a una virgoletta singola oa una virgoletta doppia, come posso scriverla con grep? 'grep '["] \' "' non sembra funzionare ... – tonix

0

Io non credo che sia grep che si comporta in modo diverso, è la shell. Sto assumendo che si sta utilizzando bash

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

Fondamentalmente le versioni citate si comportano in modo diverso sulla barra, a seconda del meccanismo citando.

Entrambi gli esempi citati avrebbero funzionato senza la barra. Per il primo, la shell potrebbe sfuggire (e passare solo show (a grep per il pattern)

2

Le virgolette cambiano ciò che vede grep. La barra rovesciata (\) nel modulo non quotato viene elaborata dalla shell, che considera i caratteri dopo la barra rovesciata come speciale. Questo succede prima che grep ottenga il parametro. grep see show () Quando vengono utilizzate le virgolette (singole o doppie), la shell le interpreta come "lascia il contenuto da solo", quindi grep vede mostra \ ( e il \ ( caratteri hanno significato in grep e si sta cercando la parentesi di chiusura - \)

BTW:. singolo e la manipolazione doppio apice è diverso nel modo in cui la shell gestisce variabili di shell, ma non ci sono variabili di shell nel tuo esempio

+0

Capito, grazie! – Hamy

3

per:

.
grep -e show(test.txt 

non funziona, perché la shell interpreta il ( come speciale, una parentesi, non solo un carattere, e non riesce a trovare il ) di chiusura.

Questi due lavori:

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

perché la shell tratta il testo citato come solo testo, e lo passa a grep.

queste non funzionano:

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

perché la shell passa show\( a grep, grep vede \( come speciali, una parentesi, non è solo un personaggio, e non riesce a trovare la chiusura \).

Problemi correlati