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 문자와 일치해야 함을 암시하는 것 같지만 예를 들어 인증된 OS인 Solaris 11에서는 그렇지 않습니다 /usr/xpg4/bin/sh(대신 리터럴로 일치함 \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는 역참조를 지원하지 않습니다. ERE를 사용 sed하는 GNU는 -r표준에 대한 확장으로 역참조를 지원하는 GNU ERE입니다. 그게 무슨 뜻이야?

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

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

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

POSIX이며 이식 가능합니다. POSIX BRE는 과거 구현과 마찬가지로 역참조를 지원합니다 grep. perl정규식이나 PCRE는 역참조도 지원하므로 다음을 수행할 수 있습니다.

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

관련 정보