Awk 正则表达式中的反向引用

Awk 正则表达式中的反向引用

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

相关内容