AWK expressão regular negativa

3

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

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

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

Seria ótimo se alguém pudesse ajudar com uma expressão regular do 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 apenas de expressão regular. Não é possível alterar o código Awk

no AWK, é como string" ~ /regex/

só pode passar um regex para conseguir isso.

    
por kshitij 25.10.2016 / 18:05

4 respostas

9

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

Algo parecido com isto:

/regex/{ next; }
{ print; }
    
por 25.10.2016 / 21:58
3

Tente:

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'

Isso só funciona para strings (como domain aqui) onde todos os caracteres são diferentes.

    
por 27.10.2016 / 00:06
2

awk não suporta PCRE (Perl Compatible Regular Expression), portanto, você não pode usar qualquer lookaround de largura zero como a lookaound negativa que está usando, (?!word +) .

O mecanismo Regex do

awk suporta apenas ERE (Expressão Regular Estendida). Você precisa incorporar todas as lógicas lá ou pode quebrar a lógica para atender sua necessidade. Veja também as funções incorporadas de awk , verifique se elas são de alguma ajuda em relação a isso.

    
por 25.10.2016 / 18:07
0

Embora a resposta de Thomas Dickey seja inteligente, há um jeito certo 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
    
por 30.08.2018 / 23:33