Expressão regular negativa AWK

Expressão regular negativa AWK

Estou procurando uma expressão regular awk que possa fornecer todas as strings que não correspondam a uma palavra específica.

using /^((?!word \+).)*/ funciona em java, mas não funciona em AWK.

Obter erro de falha de compilação, escapar dos colchetes corrige o erro de compilação, mas a correspondência da expressão regular não está correta.

Seria ótimo se alguém pudesse ajudar com uma expressão regular awk.

eu não posso usar string" !~ /regex/

Eu preciso usar string" ~ /regex/ regex para passar para todas as strings, mas para uma string específica.

As strings que contêm domaindevem ser filtradas. Entrada

This is domain test
This is do test
This is test

Saída

This is do test
This is test

Precisa fazer apenas com expressão regular. Não é possível alterar o código Awk

no AWK é comostring" ~ /regex/

então só pode passar um regex para conseguir isso.

Responder1

Embora a resposta de Thomas Dickey seja inteligente, existe uma maneira certa de fazer isso:

awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF

This is do test
This is test

Responder2

A maneira como você faz isso no awk é escrever um padrão que corresponda ao que você desejaexcluir, e faça seuAção next. Isso deixa as linhas para processar, que são a negação do padrão que você está tentando alcançar.

Algo assim:

/regex/{ next; }
{ print; }

Ou se o seu script for mais complicado e você não puder 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

Responder3

Porque você declarou"Precisa fazer apenas com expressão regular. Não é possível alterar o código Awk"tente isto:

Em vez de "negação do operador" você pode "negar a regex". Você só precisa passarsímbolo de negação!como parte do regex !/domain/para o script awk.

awk '{if ($0 ~ !/domain/) {print $0}}'

Responder4

Escrever um padrão negado com expressões regulares estendidas POSIX é particularmente complicado. Para este caso de uma string domainonde todos os caracteres são diferentes, você pode tentar:

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'

Eu pensei nisso anos atrás e voltei paraaquele meu artigosempre que preciso escrever um regexp negativo, mas devo admitir que não me lembro como cheguei a isso.

informação relacionada