Problema com expressão regular no gawk ('\' não está funcionando)

3

Estou tentando entrar um pouquinho no bash. Eu estava passando por este guia , mas o segundo exemplo em esta subseção no gawk parece não funcionar.

O problema é este comando:

ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }'

Funciona apenas se eu substituir \< por um espaço. Eu também tentei usar \y , mas também não tive sorte.

Alguém tem alguma idéia de qual é o problema?

Obrigado :)

    
por martin-is-my-name 05.08.2014 / 22:34

1 resposta

4

O manual GNU awk ( seção 3.5 ) documenta que o regex \< é específico do gawk e, portanto, não se deve esperar que ele funcione em outras implementações.

De acordo com man mawk , se você colocar uma barra invertida na frente de um caractere não especial, a barra invertida é removida. Assim, sob mawk , \< é interpretado simplesmente como um caractere de colchete angular.

Exemplos

Eu simplifiquei o regex para fornecer exemplos do comportamento diferente:

$ echo -e " a\n ab.conf\n <ac.conf" | gawk '/\<(a|x)/ { print}'
 a
 ab.conf
 <ac.conf
$ echo -e " a\n ab.conf\n <ac.conf" | mawk '/\<(a|x)/ { print}'
 <ac.conf

Novamente, gawk interpreta \< como o começo de uma palavra, enquanto mawk a interpreta simplesmente como um colchete angular.

O que o POSIX diz sobre esse problema

O manual do GNU awk explica:

If you place a backslash in a string constant before something that is not one of the characters previously listed, POSIX awk purposely leaves what happens as undefined.

Em outras palavras, neste caso, os diferentes intérpretes awk estão livres para tomar suas próprias decisões.

    
por 05.08.2014 / 23:22