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]ありません。

答え2

sed 's/abcd\(X[0-9][a-z]ad\)45das/\1/g' your_file_name

それは行わなければなりません。

答え3

あなたはsedこの特定の順序を理解していません\d。または文字クラス\dに置き換えます。[0-9][:digit:]

$ cat file.txt
abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

$ sed -nr 's/.*(X\d)(.*)45.*/\1\2/p' file.txt   

$ sed -nr 's/.*(X[0-9])(.*)45.*/\1\2/p' file.txt
X1yad
X2fad
X3had
X4wad
X5mad

関連情報