[英]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进行报价的命令确实很棘手:
对于以下命令:
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.