[英]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.