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 $_;
}

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

我无法让它与 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]or ,更一般地,[[:digit:]]代替它:

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

请注意,它[[:digit:]]是 unicode 安全的,但[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

相关内容