Não está no padrão awk
(POSIX awk
usa POSIX EREs que não suportam referências anteriores e significa o caractere 0x1 no awk, embora existem algumas ambiguidades ). É possível com
busybox awk
usando:
busybox awk '$0 ~ "^(.*)o\1$"'
(o que pode ou não fazer (se "\1"
deve coincidir com um literal ou o caracter 0x1 ou não ser especificado) não está claro na especificação POSIX. Na minha leitura, parece implicar que deve corresponder a uma 0x1, mas não com
/usr/xpg4/bin/sh
no Solaris 11, por exemplo, que é um sistema operacional certificado (onde corresponde a um literal ))
Com qualquer awk
, para esse regexp específico, você poderia adotar outra abordagem como:
awk 'length % 2 && \
substr($0, (length+1)/2, 1) == "o" && \
substr($0, 1, (length-1)/2) == substr($0, (length+3)/2)'
Como mencionado acima, os POSIX EREs não suportam referências anteriores. O GNU sed
com -r
usa EREs, mas isso é o GNU EREs que suporta referências anteriores como uma extensão do padrão. O que isso significa é que
grep -Ex '(.*)o'
(ou mesmo com egrep
) não é portátil. No entanto:
grep -x '\(.*\)o'
é POSIX e portátil. POSIX BREs suportam referências anteriores, assim como implementações históricas de grep
. perl
regexps ou PCREs também suportam referências anteriores para que você possa fazer:
perl -lne 'print if /^(.*)o$/'