![如何在 sed 命令中使用变量?](https://linux22.com/image/812752/%E5%A6%82%E4%BD%95%E5%9C%A8%20sed%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%EF%BC%9F.png)
QQ
我尝试用以下代码进行替换ZZ
,但是它并没有达到我想要的效果:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
但是,这段代码实现了我想要的功能:
sed -i 's/QQ/ZZ/g' $file
如何在中使用变量sed
?
答案1
shell 负责扩展变量。当您对字符串使用单引号时,其内容将按字面意思处理,因此sed
现在尝试用 替换每个出现的$var1
文字ZZ
。
使用双引号
使用双引号使 shell 扩展变量同时保留空格:
sed -i "s/$var1/ZZ/g" "$file"
当您需要在替换字符串中使用引号字符时,必须在其前面加上反斜杠,这将由 shell 解释。在以下示例中,字符串quote me
将被替换为"quote me"
(字符&
被解释为sed
):
sed -i "s/quote me/\"&\"/" "$file"
使用单引号
如果您有很多 shell 元字符,请考虑对模式使用单引号,对变量使用双引号:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
请注意我是如何使用的,s,pattern,replacement,
而不是s/pattern/replacement/
,我这样做是为了避免/
干扰\0/
。
例子
然后,shellsed
使用以下参数运行上述命令(假设pattern=bert
和file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
如果file.txt
包含bert
,则输出将是:
Say hurrah to bert: \0/
答案2
我们可以sed
使用双引号来使用变量:
sed -i "s/$var/r_str/g" file_name
/
如果变量中有斜线,则使用不同的分隔符,如下所示:
sed -i "s|$var|r_str|g" file_name
答案3
扩大(双关语)@mani 的回答,
- 此解决方案适用于输入到其他命令的正则表达式,例如
perl
- 使用双引号括住正则表达式(是的,即使在 Unixy 系统下也是如此)以便按预期扩展变量
|
也可能出现在变量的值中,所以不要害怕尝试其他分隔符