AWK expresión regular negativa

AWK expresión regular negativa

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 domaindeben 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 domaindonde 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.

información relacionada