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

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

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=bertfile=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 系统下也是如此)以便按预期扩展变量
  • |也可能出现在变量的值中,所以不要害怕尝试其他分隔符

相关内容