¿Expresión regular inversa en AWK?

¿Expresión regular inversa en AWK?

Estoy intentando filtrar las líneas que contienen una palabra en particular. La expresión regular es una entrada de línea de comando al script.

$0 ~ regex {
//Do something.
}

La entrada de muestra es:

**String** **number**
domain  1
domain  2
bla     3

Entonces, a partir de la entrada anterior, el usuario puede decir: filtrar las filas que tienen la palabra "dominio".

Lo que he probado:

regex = "\?\\!domain" 

(mirada hacia adelante negativa).

Pero esta expresión regular filtra cada fila. No sólo las filas con la palabra "dominio".

Respuesta1

Para un archivo de entrada dado inputque contiene lo siguiente:

domain
demesne

Para filtrar por líneas que contienen domain:

$ awk '/domain/ { print }' input
domain

Para filtrar por líneasnoque contiene domain:

$ awk '!/domain/ {print }' input
demesne

Para filtrar según elcampoen lugar de la línea completa, podemos probar lo siguiente para el nuevo inputarchivo dado:

example www.example.com
exemplar www.example.net

Para filtrar líneas donde está el primer campocontiene example:

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

En su pregunta, utilizó $0cuál es la línea completa en lugar del primer campo.

Respuesta2

Otra forma más flexible/potente de filtrar líneas es con {next}:

  • Para imprimir todas las líneas quenocoincidir con un dado regex, hacer:
    awk '/regex/ {next} {print}' inputfile
    

Incluso puedes filtrar todas las líneas entre dos líneas específicas con este método, de la siguiente manera:

  • Para imprimir todas las líneas queno sonentre una línea coincidente regex1y la primera línea siguiente coincidente regex2, haga:

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    lo cual no es posible con el awk '!/regex/'método (si no me equivoco).

Por ejemplo, si inputfileel contenido de tu es este:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

Entonces, este comando awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfileimprimiría:

hello, here is my confidential information


This is the end of my message

Respuesta3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

información relacionada