将变量传递给 sed

use*_*619 13 shell sed shell-script quoting variable-substitution

我不能不sed$NUMBER表单中使用 shell 变量。我的 shell 脚本中有这一行:

cat shared.txt sed 's/whatever1/$2 ... whatever2/' > shared2.txt
Run Code Online (Sandbox Code Playgroud)

结果shared2.txt如下:

...$2....
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

cuo*_*glm 21

尝试使用双引号而不是单引号:

sed "s/whatever1/$2 ... whatever2/" shared.txt > shared2.txt
Run Code Online (Sandbox Code Playgroud)

  • 我对 bash 的最大抱怨是,像这些简单的事情可能会让我绊倒这么久。谢谢! (2认同)

小智 5

虽然使用双引号有效,但在某些情况下这不会给出您想要的。例如,

t="bcd"
echo '123$tbcd' | sed "s/$t$t//"
Run Code Online (Sandbox Code Playgroud)

(是的,这有点做作!)。您可以通过转义某些字符来避免这种情况:

echo '123$tbcd' | sed "s/\$t$t//"
Run Code Online (Sandbox Code Playgroud)

但很容易错过这一点。在我看来,最安全的方法是用双引号将变量括起来(这样空格不会阻止 sed 命令)并用单引号将字符串的其余部分括起来(以避免转义某些字符的必要性):

echo '123$tbcd' | sed 's/$t'"$t"'//'.
Run Code Online (Sandbox Code Playgroud)