![Expressão regular negativa AWK](https://rvso.com/image/97224/Express%C3%A3o%20regular%20negativa%20AWK.png)
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 domain
devem 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 domain
onde 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.