为什么SED命令在服务器上有效,但在远程服务器上无效?

时间:2019-05-16 14:46:33

标签: shell sed ssh ksh remote-server

我有一个sed命令,当我直接在服务器上运行它时,它可以完美运行。但是,当我尝试从另一台服务器运行它时,似乎并不想获取我所有的sed命令。

服务器红帽。我已经从服务器上直接尝试了我的命令,该命令运行正常,但是通过另一台服务器却没有尝试过。

这是我的ssh命令:

ssh 'user@host' sudo -S -u webm sh -c "sed -i 's/^wrapper.java.additional.50=-agentpath:\"\/webmethods\/dynatrace/#wrapper.java.additional.50=-agentpath:\"\/webmethods\/dynatrace/g' /webmethods/eg_*/profiles/IS_default/configuration/custom_wrapper.conf"

我希望更改文件内容,但我收到此消息: sed:-e表达式#1,字符54:`s'的未知选项

最后,它将在ksh脚本中。

谢谢

1 个答案:

答案 0 :(得分:2)

双引号本身会将\/解释为/,您需要双反斜杠以将转义保留为双引号。

如果可能的话,将命令发送到shell的stdin可能会更容易:

cat << EOF | ssh 'user@host' sudo -S -u webm sh
sed -i 's/^wrapper.java.additional.50=-agentpath:"\/webmethods\/dynatrace/#wrapper.java.additional.50=-agentpath:"\/webmethods\/dynatrace/g' /webmethods/eg_*/profiles/IS_default/configuration/custom_wrapper.conf
EOF

此外,请使用不同的定界符以避免转义。您可以使用字符串中未出现的任何字符:

sed -i 's%^wrapper.java.additional.50=-agentpath:"/webmethods/dynatrace%#wrapper.java.additional.50=-agentpath:"/webmethods/dynatrace%g'

还请注意,.可以匹配任何字符,但是您可能不想匹配类似

的字符串
wrapperAjavaBadditionalC50=-agentpath:"/webmethods/dynatrace

使用\.[.]来匹配文字点。