如何在 sed 和 ssh 中使用引号?

如何在 sed 和 ssh 中使用引号?

我无法让它在 bash/rhel 7 中工作:

ssh host "sed -i -e \"s/dnl MASQUERADE_AS.*\$/MASQUERADE_AS(\`domain.com\')dnl/\" /etc/mail/sendmail.mc"

bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

我本质上想要这个 sed ,它可以在常规命令行上运行,但会在 ssh 中中断:

sed -i -e "s/dnl MASQUERADE_AS.*$/MASQUERADE_AS(\`domain.com\')dnl/" /etc/mail/sendmail.mc

有人有主意吗?非常感激。

答案1

使用杰夫的想法对脚本本身使用此处文档sed(好吧,他提到了“此处字符串”,但我认为您在引用那里也会遇到问题):

ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END

如果sed远程主机上的 可以sed使用 从标准输入读取脚本-f -,那么这可能会起作用(否则,例如在某些 BSD 系统上,尝试-f /dev/stdin)。

该命令调用sed远程主机并sed在标准输入上传递编辑脚本。sed由于 中的引号,该脚本是单引号的'SED_END',因此 shell 不会尝试扩展其文本中的内容。

我还删除了正则表达式中的尾随,$因为不需要它(.*无论如何都会匹配到行尾)。

一个稍微短一点的sed脚本(只是避免提及MASQUERADE_AS两次):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/

相关内容