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$/'

相關內容