Sed

sed 正則表達式的行為與 vim 和 perl 中的不同?

  • May 13, 2016

這是一個範例“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 中做錯了什麼?

sed不明白\d。您可以使用[0-9],或者更一般地說,[[:digit:]]在它的位置:

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

請注意,這[[:digit:]]是 unicode 安全的,但[0-9]不是。

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

應該這樣做。

引用自:https://unix.stackexchange.com/questions/279368