Sed
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 中做錯了什麼?
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
應該這樣做。