
Возможно ли это сделать в Awk?:
echo "eoe" | sed -nr '/^(.*)o\1$/p'
решение1
Не входит в стандарт awk
(POSIX awk
использует POSIX ERE, которые не поддерживают обратные ссылки, и \1
означает символ 0x1 в awk, хотяесть некоторые неясности). Это возможно с busybox awk
помощью:
busybox awk '$0 ~ "^(.*)o\\1$"'
(что это может или не может делать ( "\\1"
должно ли это соответствовать литералу \1
или символу 0x1 или быть неопределенным)неясно в спецификации POSIX. В моем прочтении это, похоже, подразумевает, что он должен соответствовать символу 0x1, но это не так, /usr/xpg4/bin/sh
например, в Solaris 11, которая является сертифицированной ОС (где он соответствует литералу \1
))
С any awk
для этого конкретного регулярного выражения вы можете использовать другой подход, например:
awk 'length % 2 && \
substr($0, (length+1)/2, 1) == "o" && \
substr($0, 1, (length-1)/2) == substr($0, (length+3)/2)'
Как упоминалось выше, POSIX ERE не поддерживают обратные ссылки. GNU sed
использует -r
ERE, но это GNU ERE, которые поддерживают обратные ссылки как расширение стандарта. Это означает, что
grep -Ex '(.*)o\1'
(или то же самое с egrep
) не является переносимым. Однако:
grep -x '\(.*\)o\1'
является POSIX и переносимым. POSIX BRE поддерживают обратные ссылки, как и исторические реализации grep
. perl
regexps или PCRE также поддерживают обратные ссылки, поэтому вы можете сделать следующее:
perl -lne 'print if /^(.*)o\1$/'