Awk正規表現の逆参照

Awk正規表現の逆参照

awkでこれは可能ですか? :

echo "eoe" | sed -nr '/^(.*)o\1$/p'

ベストアンサー1

標準にはありませんawk(POSIXはawk逆参照をサポートしないPOSIX EREを使用し、\1awkで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$/'

おすすめ記事