问题描述
我尝试了下面的代码来替换QQ
与ZZ
,但它不会做我想要的:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
但是,这段代码做了我想要的:
sed -i 's/QQ/ZZ/g' $file
我如何在sed
中使用变量?
最佳解决方法
shell负责扩展变量。当你为字符串使用单引号时,它的内容将被直接处理,所以sed
现在试图用ZZ
来替换文字$var1
的每一处出现。
使用双引号
使用双引号使shell扩展变量,同时保留空格:
sed -i "s/$var1/ZZ/g" "$file"
如果需要替换字符串中的引号字符,则必须在它之前加上一个将由shell解释的反斜线。在以下示例中,字符串quote me
将被"quote me"
替换(字符&
由sed
解释):
sed -i "s/quote me/\"&\"/" "$file"
使用单引号
如果您有很多shell meta-characters,请考虑为模式使用单引号,并为变量使用双引号:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
注意我如何使用s,pattern,replacement,
而不是s/pattern/replacement/
,我是这么做的,以避免干扰\0/
中的/
。
例子
然后,shell使用下一个参数(假设pattern=bert
和file=text.txt
)运行上述命令sed
:
-i
s,bert,Say hurrah to &: \0/,
text.txt
如果file.txt
包含bert
,则输出为:
Say hurrah to bert: \0/
次佳解决方法
我们可以使用双引号在sed
中使用变量:
sed -i "s/$var/r_str/g" file_name
如果变量中有斜杠/
,则使用不同的分隔符,如下所示:
sed -i "s|$var|r_str|g" file_name