Awk 정규식의 역참조

Awk 정규식의 역참조

awk에서 이런 작업이 가능한가요? :

echo "eoe" | sed -nr '/^(.*)o\1$/p'

답변1

표준에는 없음 awk(POSIX는 awk역참조를 지원하지 않는 POSIX ERE를 사용하고 \1awk에서 0x1 문자를 의미함)약간의 모호함이 있습니다.). 다음을 사용하여 가능하지만 busybox awk:

busybox awk '$0 ~ "^(.*)o\\1$"'

(할 수 있는 것과 하지 않을 수 있는 것( "\\1"리터럴 \1또는 0x1 문자와 일치해야 하는지 또는 지정되지 않았는지 여부)은 다음과 같습니다.POSIX 사양에서는 명확하지 않습니다.. 내가 읽은 바에 따르면 0x1 문자와 일치해야 하지만 /usr/xpg4/bin/sh인증된 운영 체제인 Solaris 11에서는 일치하지 않는 것으로 보입니다 (리터럴과 일치함 \1).

특정 정규식의 경우 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는 ERE를 sed사용 -r하지만 GNU ERE는 표준 확장으로 역참조를 지원합니다. 그게 무슨 뜻이야?

grep -Ex '(.*)o\1'

(또는 와 동일 egrep)은 이식성이 없습니다. 하지만:

grep -x '\(.*\)o\1'

POSIX이며 이식 가능합니다. POSIX BRE는 grep.regex 나 PCRE가 역참조 를 지원하는 것처럼 perl역참조를 지원하므로 다음을 수행할 수 있습니다.

perl -lne 'print if /^(.*)o\1$/'

관련 정보