我试图在一个文件中替换(例如)6.0乘6.1,而不是用6.1取代640
我目前:
sed -i "s/$previousName/$newName/" 'myFile'
我认为解决方案可以在here,但我找不到合适的解决方案。
编辑这两个字符串都在一个变量中,这个问题应该是重复的,不处理这种情况
答案 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$