我需要一些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”之间的空白区域
由于
答案 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