Estou tentando imprimir as linhas usando o símbolo de repetição {n}, mas ele não está funcionando. Para. por exemplo, eu quero imprimir todas as linhas cujo comprimento é de 4 caracteres
awk '/^.{4}$/' test_data
O código acima não está imprimindo isso. Como corrigi-lo para que eu possa usar o símbolo de repetição? Eu sei a alternativa como awk '/^....$/' test_data
eawk 'length ==3 ' test_data
awk
regular-expression
Forever Learner
fonte
fonte
awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo'
para combinar exatamente 4 caracteres. Além disso, como você mencionou,awk 'length($0) == 4' test_data
é compatível com quase todas asawk
versões.awk --re-interval '/^.{4}$/' test_data
ouawk --posix '/^.{4}$/' test_data
trabalha?Respostas:
De acordo com o Guia do Usuário do GNU Awk: Histórico de recursos , o suporte para operadores de intervalo de expressão regular foi adicionado na versão 3.0, mas inicialmente exigia a opção explícita da linha de comando
Novas opções de linha de comando:
Em
gawk
4.0,Como você está usando o
gawk
3.x, você precisará usarou
ou (obrigado @ StéphaneChazelas) se você quiser uma solução portátil, use
(desde
--posix
ou--re-interval
causaria um erro em outrasawk
implementações).fonte
POSIXLY_CORRECT=anything awk '/^.{4}/'
pois isso cria código portátil (a--posix
ou--re-interval
causaria um erro em outrasawk
implementações).EREs ( expressões regulares estendidas como usadas por
awk
ouegrep
) inicialmente não possuíam{x,y}
. Foi introduzido pela primeira vez em BREs (conforme usado porgrep
oused
), mas com a\{x,y\}
sintaxe que não quebrava a portabilidade reversa.Mas quando foi adicionado aos EREs com essa
{x,y}
sintaxe, ele quebrou a portabilidade reversa, pois umfoo{2}
ER estava correspondendo a algo diferente antes.Portanto, algumas implementações optaram por não fazer isso. Você verá que
/bin/awk
,/bin/nawk
e/bin/egrep
no Solaris ainda não honrá-lo (você precisa usar/usr/xpg4/bin/awk
ou/usr/xpg4/bin/grep -E
). Mesmo paraawk
enawk
no FreeBSD (com base noawk
mantido por Brian Kernighan (ok
noawk
)).Para o GNU
awk
, até relativamente recentemente (versão 4.0), você precisava chamá-POSIXLY_CORRECT=anything awk '/^.{4}$/'
lo para honrá-lo.mawk
ainda não o honra .Observe que esse operador é apenas açúcar sintático.
.{3,5}
sempre pode ser escrito,....?.?
por exemplo (embora,{3,5}
é claro, seja muito mais legível e o equivalente a(foo.{5,9}bar){123,456}
seja muito pior).fonte
Isso funciona como esperado com o GNU
awk
(gawk):Mas falha com o
mawk
que está mais próximo do POSIXawk
e, AFAIK, é o padrão nos sistemas Ubuntu:Portanto, uma solução simples seria usar em
gawk
vez deawk
. A{n}
notação não faz parte da sintaxe POSIX BRE (expressão regular básica). É por isso quegrep
também falha aqui:No entanto, faz parte do ERE (expressões regulares estendidas):
Não sei qual tipo de expressão regular é usado pelo. Eles usam uma versão mais antiga do ERE de acordo com a resposta de Stéphane . De qualquer forma, aparentemente você está usando uma versãomawk
POSIXawk
, mas acho que é BREawk
que não implementa ERE ou sua entrada não possui linhas com exatamente 4 caracteres. Isso pode acontecer devido ao espaço em branco que você não vê ou unicode glifos, por exemplo.fonte
length($0)
que é mais eficiente do que as expressões regulares.mawk
não está realmente mais perto do POSIXawk
e não usa BREs. Ele usa EREs, mas sem o{x,y}
operador.