逃避我有一個Ruby腳本調用「sed的」像這樣:桑達從內紅寶石
command = "sed -i \"s*#{find_what]}*#{replace_with}*\" #{file} "
system `#{command}`
當我有跨多行是不正確轉義,似乎都在同一行中替換字符串文件」。
我該怎麼做才能正確地逃避字符串,所以sed用換行符完好取代它?
感謝
逃避我有一個Ruby腳本調用「sed的」像這樣:桑達從內紅寶石
command = "sed -i \"s*#{find_what]}*#{replace_with}*\" #{file} "
system `#{command}`
當我有跨多行是不正確轉義,似乎都在同一行中替換字符串文件」。
我該怎麼做才能正確地逃避字符串,所以sed用換行符完好取代它?
感謝
我相信你的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
在腳本中,請使用基於陣列的執行方法由Ismael和pguardiario的建議。有關詳細的原因,請參閱熱鬧的Process Identifier Preservation Society website,爲什麼避免使用shell啓動每個新進程會更安全?當然,更好的方法是使用Ruby內置的替換支持。
非常感謝您的快速回復。我的replace_with字符串實際上包含「\ n」。我一直在測試,以下內容似乎正確地逃避了換行符: 'command.gsub!(/ \ n /,'\\\ n')' – user1032752 2011-12-20 03:56:50
但是'sed'處理's /換行符/.../'? – 2011-12-20 04:01:46
@ muis:我想象不好。但是到目前爲止,user1032752剛剛提到_replacement string_有換行符,這很適合我。 – sarnold 2011-12-20 04:05:08
它可能會更有意義的命令拆分成多張指定參數時,需要只有第一will get expanded
exec '/bin/echo', '-e', 'first line \n second line'
script = "s*#{find_what}*#{replace_with}*"
system "sed", "-i", "-e", script, file
這樣的沒有逃脫。
在Ruby中調用'sed(1)'是什麼原因? Ruby可以完成所有'sed(1)'可以做的事情,然後更多。而且更便攜。 – sarnold 2011-12-20 03:35:43
絕對 - 但Ruby腳本有時通過SSH與遠程系統上的文件進行交互。這樣我可以有一個命令可以在本地文件系統上執行,也可以作爲SSH命令發送。 – user1032752 2011-12-20 03:42:45
啊,所以你在一個函數中生成命令,然後通過'ssh'在另一個函數中執行它......好吧。打的好。 :) – sarnold 2011-12-20 03:44:46