
Awk에서 이 작업을 수행할 수 있습니까?:
echo "eoe" | sed -nr '/^(.*)o\1$/p'
답변1
표준이 아님 awk
(POSIX는 awk
역참조를 지원하지 않는 POSIX ERE를 사용하고 \1
awk에서 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$/'