是否可以在 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$/'