sed 正则表达式的行为与 vim 和 perl 中的不同?

Sun*_*eep 3 vim sed perl regular-expression

这是一个示例“test.txt”

abcdX1yad45das
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das
Run Code Online (Sandbox Code Playgroud)

示例所需的输出:

X1yad
X2fad
X3had
X4wad
X5mad
Run Code Online (Sandbox Code Playgroud)

我可以让它在 vim 中工作:

:% s/\v.*(X\d)(.*)45.*/\1\2/
Run Code Online (Sandbox Code Playgroud)

并在 perl 中工作以及:

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

我最终的正则表达式需要两个分组,这个示例输出不需要

我无法使用 sed 使其正常工作:

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

只是为了检查 sed 是否有效,

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

我在 sed 中做错了什么?

Joh*_*024 5

sed不明白\d。您可以使用,[0-9]或者更一般地说,[[:digit:]]代替它:

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

请注意,这[[:digit:]]是 unicode-safe 但[0-9]不是。