
是否可以在 awk 中執行此操作?
echo "eoe" | sed -nr '/^(.*)o\1$/p'
答案1
不在標準中awk
(POSIXawk
使用不支援反向引用的 POSIX ERE,並且\1
意味著 awk 中的 0x1 字符,儘管有一些含糊之處)。雖然使用以下方法是可能的busybox awk
:
busybox awk '$0 ~ "^(.*)o\\1$"'
(它可能會或可能不會做什麼(是否"\\1"
應該匹配文字\1
或 0x1 字元或未指定)是POSIX 規範中不清楚。在我的閱讀中,它似乎暗示它應該匹配 0x1 字符,但/usr/xpg4/bin/sh
在 Solaris 11 上則不然,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 sed
with-r
使用 ERE,但 GNU ERE 支援反向引用作為標準的擴展。這意味著什麼
grep -Ex '(.*)o\1'
(或與 相同egrep
)不可移植。然而:
grep -x '\(.*\)o\1'
是 POSIX 且可移植的。 POSIX BRE 確實支援反向引用,就像grep
.perl
正規表示式或 PCRE 也支援反向引用,因此您可以執行以下操作:
perl -lne 'print if /^(.*)o\1$/'