grep: corrispondenza su letterale & # 8220; + & # 8221;
Domanda
Devo trovare occorrenze di " (+) " nei miei script sql, (ovvero, espressioni di join esterno Oracle). Rendendosi conto che " + " ;, " (" ;, e ") " sono tutti caratteri speciali regex, ho provato:
grep "\(\+\)" *
Ora questo restituisce occorrenze di " (+) " ;, ma anche altre righe. (Apparentemente qualsiasi cosa con parentesi aperte e chiuse sulla stessa linea.) Ricordando che le parentesi sono speciali solo per grep esteso, ho provato:
grep "(\+)" * grep "(\\+)" *
Entrambe hanno restituito solo righe che contengono " () " ;. Supponendo quindi che " + " non può essere sfuggito, ho provato un vecchio trucco:
grep "([+])" *
Funziona. Ho effettuato un controllo incrociato del risultato con uno strumento non regex.
Domanda : qualcuno può spiegare cosa sta succedendo esattamente con il " + " personaggio? C'è un modo meno kludgy per abbinare " (+) " ;?
(Sto usando il comando cygwin grep.)
MODIFICA : grazie per le soluzioni. - E ora vedo che, secondo il manuale GNU grep a cui fa riferimento Bruno, " \ +
" se usato in un'espressione di base dà " + " il suo significato esteso , e pertanto corrisponde a uno o più "(" seguito da un "))". E nei miei file è sempre " () " ;.
Soluzione
GNU grep (che è incluso in Cygwin) supporta due sintassi per le espressioni regolari: base ed estesa. grep
utilizza espressioni regolari di base e egrep
o grep -E
utilizza espressioni regolari estese. La differenza di base, dal manuale grep , è la seguente:
Nelle espressioni regolari di base i metacaratteri
?
,+
,{
,|
,(
e)
perdono il loro significato speciale; utilizzare invece le versioni rovesciate\?
,\ +
,\ {
,\ |
,\ (
e\)
.
Dato che vuoi il normale significato dei caratteri (
+
)
, uno dei seguenti due moduli dovrebbe funzionare per il tuo scopo:
grep "(+)" * # Basic
egrep "\(\+\)" * # Extended
Altri suggerimenti
Probabilmente dovrai aggiungere delle barre rovesciate perché la shell le sta inghiottendo.
ETA: In realtà, ho appena provato il mio Cygwin e grep " (+) "
sembra funzionare bene per quello che vuoi.