2011-09-22 6 views

Respuesta

40
[^x] 

Esta es una clase de caracteres que acepta cualquier carácter excepto x.

+11

Añadiré una advertencia de Mastering Regular Expressions. Tenga en cuenta que para que esto coincida debe haber algo allí. La expresión regular 'su [^ x]' coincidirá con 'suma' y 'sol', pero no 'su'. – johnny

+1

¿Cómo lo arreglas para que coincida con el caso en que mencionaste 'su'? – jcalfee314

+0

@ jcalfee314, creo que debería funcionar para agregar un? a ella como 'su [^ x]?' lo que significa que debe coincidir con cero o uno de esos personajes. – GradysGhost

1

Según mi propia experiencia, y la publicación a continuación lo admite, sed no admite la negación de expresiones regulares normales con "^". No creo que sed tenga un método de negación directa ... pero si revisas la publicación a continuación, verás algunas soluciones. Sed regex and substring negation

+0

Tipo de ... esto funciona: echo 'blahyeah' | sed 's @ href = "[^ http] @href ="/@ g' –

+0

Salidas: blahyeah (solo coincide con la URL relativa) –

+0

Esto es incorrecto. 'sed' admite la negación' [^ ...] 'muy bien. Sin embargo, tal vez su comprensión de esta construcción sea incompleta. La pregunta vinculada es útil, sin embargo. – tripleee

4

Para aquellos no está satisfecho con la respuesta seleccionada según johnny's comment.

'su [^ x]' coincidirá con 'suma' y 'sol' pero no 'su'.

Se puede saber SED a not líneas de solape con x usando la siguiente sintaxis:

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

See kkeller's answer for another example.

+1

Esto alía skip 'x su' a pesar de que se supone que debe coincidir. Podrías hacer '/ sux /! S/su //' pero eso aún saltaría 'su sux' donde tal vez el primero, pero no el segundo,' su' debería coincidir. Idealmente, el OP debería aclarar los requisitos. – tripleee

3

Hay dos posibles interpretaciones de su pregunta. Al igual que otros ya han señalado, [^x] coincide con un solo carácter que no es x. Pero una cadena vacía tampoco es x, por lo que quizás esté buscando [^x]\|^$.

Ninguna de estas respuestas se extiende a secuencias de caracteres múltiples, que es lo que la gente está buscando. Se podría construir laboriosamente algo así como

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

para componer una expresión regular que no coincide con str, pero una solución mucho más sencilla en sed es borrar cualquier línea que hace partido str, a continuación, mantener el resto;

sed '/str/d' file 

Perl 5 introdujo un motor de expresiones regulares mucho más rica, que es por lo tanto estándar en Java, PHP, Python, Perl, etc. Debido a que amablemente admite un subconjunto de la sintaxis sed, que probablemente se podría convertir un simple script en Perl para sed a llegar a utilizar una característica útil de este dialecto expresión regular extendida, como afirmaciones negativas:

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

va a reemplazar una cadena que no es str con not. El (?:...) es un grupo que no captura (a diferencia de muchos dialectos sed, un paréntesis no guardado es un metacarácter en Perl) y (?!str) es una afirmación negativa; el texto inmediatamente después de esta posición en la cadena no debe ser str para que la expresión regular coincida. El + repite este patrón hasta que no coincide. Observe cómo la afirmación debe ser cierta en cada posición del partido, por lo que emparejamos un personaje a la vez con . (los novatos suelen equivocarse, y erróneamente solo afirman, por ejemplo, al comienzo de un patrón más largo, que podría coincidir con str en algún lugar dentro, lo que lleva a una "fuga").

Cuestiones relacionadas