awkでこれは可能ですか? :
echo "eoe" | sed -nr '/^(.*)o\1$/p'
ベストアンサー1
標準にはありませんawk
(POSIXはawk
逆参照をサポートしないPOSIX EREを使用し、\1
awkで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$/'