繁体   English   中英

如何跨ssh使用sed远程替换文件中的行?

[英]How to remotely replace a line in a file using sed across ssh?

我有一个sed命令,在Linux机器上运行时,它可以正常运行。 此命令搜索匹配的模式“ AdvancedConfiguration_1”,并替换下一行中的URL语句并更新文件。

cd /tmp

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

我的要求是通过ssh从脚本远程调用此命令。 但是,当我尝试在ssh中使用命令时,它给了我错误。 我尝试将转义序列用于双引号和大括号,但似乎没有任何效果。 请帮助我解决此问题。

码:

ssh -n -o StrictHostKeyChecking=no $user@$host "sudo su - $sudo_user -c'

cd /tmp

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

错误输出:

sed:-e表达式#1,字符0:不匹配的'{'bash:第3行:s / URL =。* / URL = http:// myurl / } file.txt:没有这样的文件或目录

在处理报价时,使用ssh进行报价的命令确实很棘手:

  1. 首先由用于启动ssh的本地shell
  2. 然后由ssh使用的远程shell执行远程命令

对于以下命令:

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

尝试使用ssh引用以下内容:

sed -i \''/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}'\' file.txt

另一种方法

当命令变得过于复杂时,就是在远程端创建一个脚本文件并执行它。 这是一个在本地创建脚本,使用scp复制脚本然后通过ssh运行脚本的示例:

cat >myscript <<!
sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt
!

scp myscript ...
ssh ... sh myscript

在进行某些替换(例如环境变量评估)时,请小心“此处文档”。

不确定sed命令,但是您可以尝试使用Ansible执行类似任务。 通过SSH配置主机要容易得多。 对于您的问题,它具有lineinfile模块,只需使用regexp标记要编辑的字符串即可。 可能在Ansible中看起来像这样:

- lineinfile: dest=/path/to/file.txt regexp=^URL= line=URL=http://myurl/

在此处查看Ansible文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM