![AWK expresión regular negativa](https://rvso.com/image/97224/AWK%20expresi%C3%B3n%20regular%20negativa.png)
Estoy buscando tener una expresión regular awk que pueda generar todas las cadenas que no coincidan con una palabra en particular.
El uso /^((?!word \+).)*/
funciona en Java pero no en AWK.
Obtener error de compilación fallido, escapar de los corchetes corrige el error de compilación, pero la coincidencia de la expresión regular no es correcta.
Sería fantástico si alguien pudiera ayudar con una expresión regular awk.
No puedo usar string" !~ /regex/
Necesito usar string" ~ /regex/
expresiones regulares que deberían pasar para todas las cadenas, excepto para una cadena específica.
Las cadenas que contengan domain
deben filtrarse. Aporte
This is domain test
This is do test
This is test
Producción
This is do test
This is test
Tiene que ver únicamente con expresiones regulares. No se puede cambiar el código Awk
en AWK es comostring" ~ /regex/
entonces solo puedo pasar una expresión regular para lograr esto.
Respuesta1
Si bien la respuesta de Thomas Dickey es inteligente, existe una forma correcta de hacerlo:
awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF
This is do test
This is test
Respuesta2
La forma de hacer esto en awk es escribir un patrón que coincida con lo que deseas.excluir, y hacer suacción next
. Eso deja las líneas para procesar, que son la negación del patrón que estás tratando de lograr.
Algo como esto:
/regex/{ next; }
{ print; }
O si tu script es más complicado y no puedes usar next
:
<<<'the quick brown fox jumps over the lazy dog'$'\n''pack my box with five dozen liquor jugs' awk '
{ negate=0 }
/box/{ negate=1 }
negate==1 { gsub(/[aeiou]/, "%") }
negate==0 { gsub(/[aeiou]/, "#") }
{ print NR, $0; }
'
# output
1 th# q##ck br#wn f#x j#mps #v#r th# l#zy d#g
2 p%ck my b%x w%th f%v% d%z%n l%q%%r j%gs
Respuesta3
porque dijiste"Tiene que ver únicamente con expresiones regulares. No se puede cambiar el código Awk"prueba esto:
En lugar de "negar el operador", puedes "negar la expresión regular".. solo necesitas pasarsímbolo de negación!
como parte de la expresión regular !/domain/
del script awk.
awk '{if ($0 ~ !/domain/) {print $0}}'
Respuesta4
Escribir un patrón negado con expresiones regulares extendidas POSIX es particularmente complicado. Para este caso de una cadena como domain
donde todos los caracteres son diferentes, puedes probar:
awk -v re="^([^d]|d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]\
*o(d*d[^do]|[^dm])|[^da])|[doma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom\
]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[^di])|[domai]*i(d*d[^do]|[d\
o]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[do\
ma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|\
[^dm])|[^da])|[^di])|[^dn]))*[domai]*\$" '$0 ~ re'
Se me ocurrió eso hace años y volví aese articulo miocada vez que necesito escribir una expresión regular negativa, pero debo admitir que no recuerdo cómo llegué a eso.