使用sed查找和替换包含非转义字符的变量

时间:2012-01-20 08:26:15

标签: bash sed replace

我可以使用它来查找“fly”的所有实例,并在我的文件中将其替换为“insect”:

sed -i 's/fly/insect/g' ./animals.txt

如何找到BASH变量并将其替换为另一个BASH变量? E.g:

name=$(echo "fly")
category=$(echo "insect")
sed -i 's/$name/$category/g' ./animals.txt

更新

我使用的是GNU sed版本4.2.1。当我尝试以下解决方案时,会报告此错误:

sed: -e expression #1, char 73: unknown option to `s'

更新

我发现错误即将发生的原因。 $category经常包含许多符号(例如“/”,“$”,“@”,“!”,括号等)。

ame=$(echo "fly")
category=$(echo "in/sect")
sed -i "s/$name/$category/g" ./animals.txt

上面的代码会产生同样的错误:

sed: -e expression #1, char 7: unknown option to `s'

有没有办法让sed完成替换,即使它遇到这些符号?

3 个答案:

答案 0 :(得分:5)

使用双引号

使用双引号使shell扩展变量,同时保留空格:

sed -i "s/$name/$category/g" ./animals.txt

注意:如果您需要在替换中添加反斜杠(例如,用于反向引用),则需要双斜杠(\&包含模式匹配):

使用单引号

如果你有很多shell元字符,你可以这样做:

sed -i 's/'$pattern'/'$category'/g' ./animals.txt

  

我发现错误即将发生的原因。 $ category经常包含许多符号(例如“/”,“$”,“@”,“!”,括号等)。

如果替换或替换部分包含/之类的字符,那么我们可以使用不同的sed分隔符集。您可以使用类似 - @ % , ; : | _等的任何字符,这些字符在您的替换和替换中不会发生。

答案 1 :(得分:3)

使用双引号,以便shell插入变量:

sed -i "s/$name/$category/g" ./animals.txt

答案 2 :(得分:2)

使用双引号:

sed -i "s/$name/$category/g" ./animals.txt