2009-10-17 8 views
16

provatocorrispondenza una linea con un asterisco letterale "*" in grep

$ echo "$STRING" | egrep "(\*)" 

e anche

$ echo "$STRING" | egrep '(\*)' 

e innumerevoli altre varianti. Voglio solo abbinare una linea che contiene un asterisco letterale in qualsiasi punto della linea.

+1

Di solito continuo ad aggiungere barre finché non ottengo quello che voglio. :) –

+2

Entrambi i tuoi esempi funzionano per me (e funzionano anche con le parentesi rimosse). –

risposta

16

Provare una classe di caratteri, invece

echo "$STRING" | egrep '[*]' 
+0

Su Windows con GnuWin32, puoi usare 'grep [*] file.txt'. –

+0

... tranne se si ha un file chiamato letteralmente '*' nella directory in cui viene eseguito. La lezione (non particolarmente da questo esempio, ma in generale) è di citare sempre le tue espressioni regolari, non importa quanto siano banali. – tripleee

1

Ecco un modo per abbinare un asterisco letterale:

$ echo "*" | grep "[*]" 
* 
$ echo "*" | egrep "[*]" 
* 
$ echo "asfd" | egrep "[*]" 
$ echo "asfd" | grep "[*]" 
$ 

Wrapping un'espressione tra parentesi di solito consente di catturare un singolo carattere speciale facilmente; questo funzionerà anche per una parentesi quadra o un trattino, ad esempio.

Fare attenzione a quando questo non è in un raggruppamento staffa:

$ echo "hi" | egrep "*" 
hi 
$ echo "hi" | grep "*" 
$ 
+1

Il tuo esempio mostra perché trovo questo comportamento di egrep irritante. Se si desidera eseguire una ricerca stringa letterale con grep, è sufficiente inserirla tra virgolette. Perché dovrei ** ** voler mai fare il grep per tutto? unix chiama quel programma 'cat' ;-) Odio l'egrep ti costringe a raggruppare caratteri regex anche se sono tra virgolette. Fine del rant. Grazie! – DaveParillo

+2

@DaveParillo: né grep né egrep sanno se il pattern che hai passato è stato quotato o meno, poiché le virgolette sono interpretate dalla shell prima che [e] grep sia lanciato. La differenza è dovuta al modo in cui grep ed egrep rispondono quando il pattern inizia con "*", che è tecnicamente non valido ("*" è un suffisso). Prova 'grep". * "' E vedrai che corrisponde a tutto. Se vuoi una ricerca letterale (non regex), usa invece 'fgrep'. –

5

Usa:

grep "*" file.txt 

o

cat file.txt | grep "*" 
+0

dato che puoi fare il primo, il secondo con gatto non è necessario. – ghostdog74

+0

Ti sento. A molte persone sembra piacere usare cat per lo streaming di un file in tutti i tipi di programmi, anche se in genere è ridondante. Ho solo pensato di includerlo per rendere l'esempio più familiare. – DaveParillo

+0

Nessuno di questi lavora sotto GNUWin32 su Windows. – Itsme2003

1
echo "$STRING" | fgrep '*' 

fgrep viene utilizzato per abbinare la speciale personaggi.

Problemi correlati