我可以使用它来查找"fly"的所有实例,并在我的文件中用"昆虫"替换它:
sed -i 's/fly/insect/g' ./animals.txt
如何找到BASH变量并用另一个BASH变量替换它?例如:
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
完成替换,即使它遇到这些符号?
使用双引号
使用双引号使shell在保留空白的同时扩展变量:
sed -i "s/$name/$category/g" ./animals.txt
注意:如果您需要在替换中放入反斜杠(例如用于反向引用),则需要双斜杠(\&包含模式匹配):
使用单引号
如果你有很多shell元字符,你可以这样做:
sed -i 's/'$pattern'/'$category'/g' ./animals.txt
我发现了出现错误的原因$类别经常包含许多符号(例如"/"、"$"、"@"、"!"、括号等)
如果替换或替换部分包含类似/
的字符,那么我们可以使用不同的sed
分隔符集。您可以使用-@ % , ; : | _
等任何在替换和替换中没有出现的字符。
使用双引号,以便shell插入变量:
sed -i "s/$name/$category/g" ./animals.txt
使用双引号:
sed -i "s/$name/$category/g" ./animals.txt