3
我想創建一個補丁,用戶可以使用sed以預定義的方式遠程編輯文件,我可以在每臺計算機上手動執行此操作,但這需要很長時間。
我掙扎的路線如下:
host=[hostname]
port=[portnum]
ssh -t $host -p $port "cp ~/file1 ~/file1.bak ; sed -i \"s/fcn1('param1', $2)\n/fcn2('param2'):$zoom\n/g\" ~/file1"
這使得文件1的備份,然後編輯該文件在一條線上。我實際上想要編輯多行,但是這一行演示了這些問題: 如果在sed命令中沒有使用$符號,則該命令有效。
我已經嘗試了多種逃避這些$符號的方法,但似乎無法找到有效的方法。 我可以使用一個。通配符在查找中,但顯然不在替換字符串中。
我會爲sed命令使用單引號,以避免擴展$ 2,但單引號已在命令內部使用。
有沒有人有任何想法如何克服這個問題?在此先感謝您的任何建議!
您需要轉義爲在字符串上完成的每個解析運行。我在考慮至少2次運行:一次用於本地shell,另一次用於遠程shell,所以你至少需要'\\ $ 2',並且可能需要'\\\\ $ 2'。 –
@Marc B謝謝,這是我的第一個想法,但我發現[鏈接] http://stackoverflow.com/questions/7990750/escape-single-quote使用\\\ $ 2。我嘗試從0-4反斜槓,但最終決定使用。第一個$的通配符可以簡化問題並專注於第二個$,但仍然不能用第二個字符串中的$替換,我嘗試使用多達四個反斜槓進行轉義:1或3返回錯誤「zoom:Undefined variable」;假定$ zoom是空的,0或2實現sed, 4在空的$ zoom之前產生一個反斜槓。我甚至嘗試用最多四個斜線定義$ zoom ='$ zoom',但沒有成功。 – user1814618
我找到了解決方案 - 暫時撤回一個shell來植入$字符; 即用[\「\\ $ \」zoom]替換[$ zoom] 這也適用於第一個示例,所以我不需要通配符。 – user1814618