对包含点的变量使用sed



我正在尝试用6.1替换(例如)6.0在一个文件中,没有640被6.1替换

我现在有:

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

我认为解决方案可能在这里,但我没有找到正确的解决方案。

EDIT这两个字符串都在一个变量内这个问题应该是重复的没有处理这种情况

使用内部sed:

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

试试这个:

sed -i "s/6.0/6.1/" 'myFile'

关键是转义模式中具有特殊意义的.字符。默认情况下,它匹配任何字符(包括640中的0),而在之前,它只匹配文字.

由于模式位于变量中,因此可以先转义其中的.,如下所示:

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

如果perl可以接受:

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

From perldoc for Q

返回包含所有ASCII非"word"字符的EXPR值斜。(也就是说,所有ASCII字符不匹配/[a- za -z_0-9]/将在返回的字符串前面加一个反斜杠,不管任何语言环境设置。)这是内部函数在双引号字符串

中实现Q转义

另一个例子:

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

进一步阅读: Perl旗帜pe -π,- p, - w, -, -, - t ?

最新更新