2013-07-10 32 views
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

您需要轉義爲在字符串上完成的每個解析運行。我在考慮至少2次運行:一次用於本地shell,另一次用於遠程shell,所以你至少需要'\\ $ 2',並且可能需要'\\\\ $ 2'。 –

+0

@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

+0

我找到了解決方案 - 暫時撤回一個shell來植入$字符; 即用[\「\\ $ \」zoom]替換[$ zoom] 這也適用於第一個示例,所以我不需要通配符。 – user1814618

回答

3

這應該工作以及:

ssh -t $host -p $port "cp ~/file1 ~/file1.bak && sed -i \"s/fcn1('param1', \\\$2)/fcn2('param2'):\\\$zoom/g\" file1" 

需要3回斜線,你必須逃離遠程慶典傳遞給sed字符串中的$符號。當你通過ssh發送它時,你必須逃避反斜槓和$符號。