白色空间捕获与sed

时间:2012-03-06 21:47:35

标签: regex sed substitution

我需要一些sed正则表达式替换的帮助。

从以下一行:

Provides          mysql                

我想得到:

Provides          mysql-5.5                

我能够提供的最佳解决方案是:

sed -i "s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g" my_file_containing_the_line

但结果不是我想要的:

Provides mysql-5.5                

这不完美,因为我丢失了“提供”和“mysql-5.5”之间的空白区域

由于

3 个答案:

答案 0 :(得分:4)

改变这个:

\(\s\)*

到此:

\(\s*\)

以便捕获组包含所有\s*,而不只包含一个\s。 (对于\(\s\)*,捕获组最终只包含最后一个空白字符。)

实际上,就此而言,您可以组合所有捕获组,并编写:

sed -i 's/\(Provides\s*\)mysql/\1mysql-5.5/g' my_file_containing_the_line

或:

sed -i 's/\(Provides\s*mysql\)/\1-5.5/g' my_file_containing_the_line

答案 1 :(得分:4)

"s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g"

\2组不包含所有空格

"s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g"将有效。

$> echo "Provides          mysql" | sed "s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g"
Provides          mysql-5.5

除此之外,您可以使用--regexp-extended选项来抑制冗余转义:

$> echo "Provides          mysql" | sed --regexp-extended "s/(Provides)(\s*)(mysql)/\1\2mysql-5.5/g"
Provides          mysql-5.5

甚至

$> echo "Provides          mysql" | sed --regexp-extended "s/(Provides\s*)(mysql)/\1\2-5.5/g"
Provides          mysql-5.5

答案 2 :(得分:0)

这可能对您有用:

echo "Provides          mysql                " | sed '/^Provides/s/mysql/&-5.5/'
Provides          mysql-5.5