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

我尝试了以下代码来替换 QQZZ,但它没有做我想做的:

var1=QQsed -i 's/$var1/ZZ/g' $file

但是,这段代码做了我想要的:

sed -i 's/QQ/ZZ/g' $file

如何在 sed?

Shell负责扩展变量。 当您对字符串使用单引号时,其内容将按字面处理,因此 sed 现在尝试替换文字的每个出现 $var1ZZ.

使用双引号

使用双引号使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/.

例子:

Shell然后运行上面的命令 sed 与下一个参数(假设 pattern=bertfile=text.txt):

-is,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

扩展(双关语意) @玛尼的回答,

  • 此解决方案将适用于馈送到其他命令的正则表达式,例如 perl
  • 在正则表达式周围使用双引号(是的,即使在Unixy系统下),以便按预期方式扩展变量
  • | 也可能出现在变量的值中,所以不要害怕尝试其他分隔符

看到[我的答案在你的这篇文章](bash - How to escape file path in SED? - Ask Ubuntu

相关:Escape a string for a sed replace pattern - Stack Overflow