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

UAd*_*ter 436 command-line bash sed

我尝试使用以下代码替换QQZZ,但它没有做我想要的:

var1=QQ
sed -i 's/$var1/ZZ/g' $file
Run Code Online (Sandbox Code Playgroud)

但是,此代码执行我想要的操作:

sed -i 's/QQ/ZZ/g' $file
Run Code Online (Sandbox Code Playgroud)

我如何在 中使用变量sed

Lek*_*eyn 582

shell 负责扩展变量。当您对字符串使用单引号时,其内容将按字面意思处理,因此sed现在尝试$var1ZZ.

使用双引号

使用双引号使 shell 扩展变量同时保留空格:

sed -i "s/$var1/ZZ/g" "$file"
Run Code Online (Sandbox Code Playgroud)

当您需要替换字符串中的引号字符时,您必须在它前面加上一个反斜杠,该反斜杠将由 shell 解释。在以下示例中,字符串quote me将替换为"quote me"(字符&由 解释sed):

sed -i "s/quote me/\"&\"/" "$file"
Run Code Online (Sandbox Code Playgroud)

使用单引号

如果您有很多 shell 元字符,请考虑对模式使用单引号,对变量使用双引号:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
Run Code Online (Sandbox Code Playgroud)

请注意我如何使用s,pattern,replacement,而不是s/pattern/replacement/,我这样做是为了避免干扰/in \0/

例子

然后 shellsed使用下一个参数(假设pattern=bertfile=text.txt)运行上述命令:

-i
s,bert,Say hurrah to &: \0/,
text.txt
Run Code Online (Sandbox Code Playgroud)

如果file.txt包含bert,输出将是:

Say hurrah to bert: \0/
Run Code Online (Sandbox Code Playgroud)

  • @b.long 这是一个 `g` 选项,所以你会传递 `s,foo,bar,g`。 (7认同)
  • 或者,对于超级偏执狂(比如我自己),`sed 's/'"${foo}"'/replacement/'` (5认同)
  • @leetbacoon 你的偏执为我节省了很多工作。由于我的任务特定原因,我无法使用上述模式。 (3认同)
  • 如何使用这种逗号分隔形式传递“/g”选项? (2认同)

小智 185

我们可以在sed使用双引号时使用变量:

sed -i "s/$var/r_str/g" file_name
Run Code Online (Sandbox Code Playgroud)

如果/变量中有斜杠,则使用不同的分隔符,如下所示:

sed -i "s|$var|r_str|g" file_name
Run Code Online (Sandbox Code Playgroud)

  • 如果变量中有斜杠`/` => 这救了我!我的变量是一个 url,它包含`/`。切换到使用 `|` 作为分隔符解决了我的问题 (27认同)
  • 大拇指“如果变量中有斜线” (9认同)
  • Mannnn...我的 var 中有一个正斜杠,并且正在拉扯我的头发...这是一个救星...非常感谢。 (2认同)