sed正規表現はvimやperlとは異なる動作をしますか?

sed正規表現はvimやperlとは異なる動作をしますか?

以下は「test.txt」のサンプルです。

abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

望ましい出力の例:

X1yad
X2fad
X3had
X4wad
X5mad

vimで動作させることができます。

:% s/\v.*(X\d)(.*)45.*/\1\2/

Perlで作業しました。

open(my $file, "<", "test.txt");
while(<$file>)
{
    s/.*(X\d)(.*)45.*/$1$2/; 
    print $_;
}

私の最終正規表現には2つのグループ化が必要ですが、この出力例では必要ありません。

sedで動作させることはできません。

sed -r 's/.*(X\d)(.*)45.*/\1\2/' test.txt
abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

sed が正常に動作していることを確認するには、

sed -r 's/(a)/#\1#/' test.txt
#a#bcdX1yad45das
#a#bcdX2fad45das
#a#bcdX3had45das
#a#bcdX4wad45das
#a#bcdX5mad45das

私はsedで何が間違っているのですか?

ベストアンサー1

sedわからない\d。代わりに、または[0-9]をより一般的に使用できます。[[:digit:]]

$ sed -r 's/.*(X[[:digit:]])(.*)45.*/\1\2/' test.txt
X1yad
X2fad
X3had
X4wad
X5mad

Unicodeは[[:digit:]]安全ですが、そうでは[0-9]ありません。

おすすめ記事