2011-12-20 130 views
1

逃避我有一個Ruby腳本調用「sed的」像這樣:桑達從內紅寶石

command = "sed -i \"s*#{find_what]}*#{replace_with}*\" #{file} " 
    system `#{command}` 

當我有跨多行是不正確轉義,似乎都在同一行中替換字符串文件」。

我該怎麼做才能正確地逃避字符串,所以sed用換行符完好取代它?

感謝

+4

在Ruby中調用'sed(1)'是什麼原因? Ruby可以完成所有'sed(1)'可以做的事情,然後更多。而且更便攜。 – sarnold 2011-12-20 03:35:43

+1

絕對 - 但Ruby腳本有時通過SSH與遠程系統上的文件進行交互。這樣我可以有一個命令可以在本地文件系統上執行,也可以作爲SSH命令發送。 – user1032752 2011-12-20 03:42:45

+0

啊,所以你在一個函數中生成命令,然後通過'ssh'在另一個函數中執行它......好吧。打的好。 :) – sarnold 2011-12-20 03:44:46

回答

2

我相信你的replace_with包含這樣的字符串:

replace_with = "this should be\non two lines" 

你需要從紅寶石解釋命令解釋程序逃避\n,使他們可以閱讀sed(1)。試試這個:

replace_with = "this should be \\\\non two lines" 

的第一加倍:\\\\\\是讓過去紅寶石所有的反斜線。第二個加倍:\\\是通過shell獲得反斜槓。 sed應該只能看到一個\

一個簡單的測試:

$ cat command.rb 
#!/usr/bin/ruby 
# 
command = "/bin/echo -e \"first line \\\\n second line\"" 

print `#{command}` 
$ ./command.rb 
first line 
second line 
$ 

如果必須使用sed在腳本中,請使用基於陣列的執行方法由Ismaelpguardiario的建議。有關詳細的原因,請參閱熱鬧的Process Identifier Preservation Society website,爲什麼避免使用shell啓動每個新進程會更安全?當然,更好的方法是使用Ruby內置的替換支持。

+0

非常感謝您的快速回復。我的replace_with字符串實際上包含「\ n」。我一直在測試,以下內容似乎正確地逃避了換行符: 'command.gsub!(/ \ n /,'\\\ n')' – user1032752 2011-12-20 03:56:50

+0

但是'sed'處理's /換行符/.../'? – 2011-12-20 04:01:46

+0

@ muis:我想象不好。但是到目前爲止,user1032752剛剛提到_replacement string_有換行符,這很適合我。 – sarnold 2011-12-20 04:05:08

2

它可能會更有意義的命令拆分成多張指定參數時,需要只有第一will get expanded

exec '/bin/echo', '-e', 'first line \n second line' 
3
script = "s*#{find_what}*#{replace_with}*" 
system "sed", "-i", "-e", script, file 

這樣的沒有逃脫。