将sed与包含点的变量一起使用

时间:2016-09-23 11:43:02

标签: bash shell sed

我试图在一个文件中替换(例如)6.0乘6.1,而不是用6.1取代640

我目前:

sed -i "s/$previousName/$newName/" 'myFile'

我认为解决方案可以在here,但我找不到合适的解决方案。

编辑这两个字符串都在一个变量中,这个问题应该是重复的,不处理这种情况

3 个答案:

答案 0 :(得分:3)

试试这个:

sed -i "s/6\.0/6.1/" 'myFile'

关键是要逃避具有特殊含义的模式中的.字符。默认情况下,它匹配任何字符(包括0中的640),而前面有\,它只匹配文字.

由于您在变量中使用了模式,因此可以先将.中的模式转义为:

previousNameE="$(sed -e 's/\./\\./' <<< "$previousName")"
sed -i "s/$previousNameE/$newName/" 'myFile'

答案 1 :(得分:2)

使用内部sed

sed -i "s@$(echo $previousName | sed 's/\./\\./g')@$newName@g" myFile

答案 2 :(得分:1)

如果perl可以接受:

perl -i -pe "s/\Q$previousName/$newName/" 'myFile'

perldoc来自\Q

  

返回所有ASCII非“word”字符的EXPR值   反斜杠。 (也就是说,所有ASCII字符都不匹配   / [A-Za-z_0-9] /将在返回的字符串中加一个反斜杠,   无论任何语言环境设置。)这是内部功能   用双引号字符串实现\ Q转义

另一个例子:

$ echo '*.^[}' | perl -pe 's/\Q*.^[}/q($abc$)/e'
$abc$

进一步阅读: Perl flags -pe, -pi, -p, -w, -d, -i, -t?