2011-09-22 12 views

risposta

40
[^x] 

Si tratta di una classe di caratteri che accetta qualsiasi carattere ad eccezione x.

+11

Aggiungerò un avvertimento da Mastering Regular Expressions. Si noti che per questo deve coincidere che ci deve essere qualcosa lì. L'espressione regolare "su [^ x]" corrisponderà a "sum" e "sun" ma non a "su". – johnny

+1

Come si fa a risolvere il caso che hai citato 'su'? – jcalfee314

+0

@ jcalfee314, credo che dovrebbe funzionare per aggiungere un? ad esso piace 'su [^ x]?' nel senso che dovrebbe corrispondere a zero o uno di quei personaggi. – GradysGhost

1

Dalla mia esperienza personale e il post sottostante supporta questo, sed non supporta la normale negazione delle espressioni regolari con "^". Non credo che sed abbia un metodo di negazione diretta ... ma se controlli il post sottostante, vedrai alcuni rimedi. Sed regex and substring negation

+0

Sort of .. funziona: echo 'blahyeah' | sed 's @ href = "[^ http] @href ="/@ g' –

+0

Uscite: blahyeah (corrisponde solo all'URL relativo) –

+0

Questo non è corretto. 'sed' supporta' [^ ...] 'negazione bene. Forse la tua comprensione di questo costrutto è incompleta, però? La domanda collegata è comunque utile. – tripleee

4

Per coloro non soddisfatto della risposta selezionata secondo johnny's comment.

'su [^ x]' corrisponde a 'somma' e 'sole' ma non a 'su'.

Si può dire sed per not partita linee con x utilizzando la seguente sintassi:

sed '/x/! s/su//' file 

See kkeller's answer for another example.

+1

Questo vorrebbe anche saltare 'x su' anche se dovrebbe corrispondere. Si potrebbe fare '/ sux /! S/su //' ma questo salterà comunque 'su sux'where forse il primo, ma non il secondo,' su' dovrebbe corrispondere. Idealmente, l'OP dovrebbe chiarire i requisiti. – tripleee

3

Ci sono due possibili interpretazioni della sua domanda. Come altri hanno già sottolineato, [^x] corrisponde a un singolo carattere che non è x. Ma anche una stringa vuota non è x, quindi forse stai cercando [^x]\|^$.

Nessuna di queste risposte si estende a sequenze multi-carattere, che di solito è ciò che le persone stanno cercando. Si potrebbe faticosamente costruire qualcosa come

[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\) 

a comporre un'espressione regolare che non corrisponde str, ma una soluzione molto più semplice in sed è quello di eliminare tutte le linee che fa partita str, poi tenere il resto;

sed '/str/d' file 

Perl 5 ha introdotto un motore di espressioni regolari molto più ricca, che è quindi normale in Java, PHP, Python, ecc, perché Perl supporta utilmente un sottoinsieme di sed sintassi, probabilmente si potrebbe convertire un semplice sed script per Perl per ottenere utilizzare una funzione utile da questo dialetto regex prolungate, quali quelle negative:

perl -pe 's/(?:(?!str).)+/not/' file 

sostituirà una stringa che non è str con not. Lo (?:...) è un gruppo non catturante (a differenza di molti dialetti sed, una parentesi senza escape è un metacarattere in Perl) e (?!str) è un'asserzione negativa; il testo immediatamente dopo questa posizione nella stringa non deve essere str in modo che la regex corrisponda. Il + ripete questo modello fino a quando non riesce a corrispondere. Nota come l'asserzione deve essere vera in ogni posizione della partita, quindi abbiniamo un personaggio alla volta con . (i neofiti spesso sbagliano e affermano solo erroneamente ad es. L'inizio di un modello più lungo, che potrebbe tuttavia corrispondere a str da qualche parte all'interno, portando ad una "perdita").

Problemi correlati