当前位置: 首页>>技术教程>>正文


我如何在sed命令中使用变量?

, , ,

问题描述

我尝试了下面的代码来替换QQZZ,但它不会做我想要的:

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=bertfile=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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/307.html,未经允许,请勿转载。