![¿Expresión regular inversa en AWK?](https://rvso.com/image/97228/%C2%BFExpresi%C3%B3n%20regular%20inversa%20en%20AWK%3F.png)
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 input
que 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 input
archivo 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ó $0
cuá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
regex1
y la primera línea siguiente coincidenteregex2
, 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 inputfile
el 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}' inputfile
imprimirí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