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 문자와 일치해야 하지만 /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$/'