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 " () " ;.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top