O GNU awk aceita intervalos especificados usando chaves em expressões regulares?

0

Quais tipos de expressões regulares são reconhecidas pelo awk? Este comando

echo "aa" | gawk '/a{2,3}/ {print}'

não retorna nada, enquanto

echo "a{2,3}" | gawk '/a{2,3}/ {print}'

retorna a{2,3} .

Como outros recursos de regex estendidos como alternância são reconhecidos, onde posso encontrar uma referência precisa? A partir do GNU find seção do manual sobre expressões regulares do awk , a sintaxe acima deve ser aceita, uma vez que:

Intervals are specified by ‘{’ and ‘}’.

    
por VeryHardCoder 12.03.2016 / 21:50

1 resposta

4

De manual :

Initially, because old programs may use ‘{’ and ‘}’ in regexp constants, gawk did not match interval expressions in regexps.

However, beginning with version 4.0, gawk does match interval expressions by default. This is because compatibility with POSIX has become more important to most gawk users than compatibility with old programs.

Como o Ubuntu 12.04 tem o GNU awk 3.1.8 e o 14.04 tem 4.0.1 , você deve estar no 12.04 (ou outro lançamento antigo).

Defina POSIXLY_CORRECT para o comportamento POSIX:

$ echo "a{2,3}" | POSIXLY_CORRECT=1 gawk '/a{2,3}/ {print}'
$ echo "aa" | POSIXLY_CORRECT=1 gawk '/a{2,3}/ {print}'
aa

Ou use a opção -r se quiser manter as extensões GNU e usar expressões de intervalo:

-r
--re-interval

Allow interval expressions (see Regexp Operators) in regexps. This is now gawk’s default behavior. Nevertheless, this option remains (both for backward compatibility and for use in combination with --traditional).

    
por muru 12.03.2016 / 22:08