用另一个文件中的数据替换一个文件中的部分内容

时间:2013-01-07 06:00:00

标签: ruby regex jruby

我有一个html文件myfile.html,其中包含一个带有这样一行的脚本:

var json = '[{"name":"Hydrogen","number":"1","symbol":"H","weight":"1.00794"},{"name":"Helium","number":2,"symbol":"He","weight":4.002602},{"name":"Lithium","number":3,"symbol":"Li","weight":6.941},{"name":"Beryllium","number":4,"symbol":"Be","weight":9.012182},{"name":"Boron","number":5,"symbol":"B","weight":10.811},{"name":"Carbon","number":6,"symbol":"C","weight":12.0107}]';

分配给变量json的单引号中的字符串实际上会有所不同。我想将此字符串替换为另一个文件myjson.json的全部内容。

我试过这里的代码: Find and replace in a file in Ruby 和这里: search and replace with ruby regex 这样做:

replace = File.read("myjson.json")
changefile = File.read("myfile.html")
changefile.sub( %r{var json = '[^<]+';}, replace )

但它不起作用。我不确定它的正则表达式是不正确的,还是更多的东西。

更新

阅读下面的回复后,我的第一次尝试是:

replace = File.read("myjson.json")
changefile = File.read("myfile.html")
changefile.sub!(%r{var json = '.+'}, replace)
puts changefile

这确实找到了,但删除了所有var json = ''并用myjson.json替换它 - 我想保留var json =并且只替换之后两个单引号之间的内容。所以我试过了:

replace = File.read("myjson.json")
changefile = File.read("myfile.html")
changefile.sub!(%r{var json = '.+'}, "var json = 'replace'")
puts changefile

但这只是将其替换为var json = 'replace'

我想使用原始var json =来查找位置,但我不希望将其删除。

所以我做了一些我认识的愚蠢和错误,但它确实有效:

replace = File.read("myjson.json")
changefile = File.read("myfile.html")
changefile.sub!(%r{var json = '.+'}, "var json = 'thanksforthehelptinman'")
changefile.sub!(%r{thanksforthehelptinman}, replace)
puts changefile

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

正则表达式不正确,因为正则表达式中保留[]。你需要逃脱它们:

%r{var json = '\[.+\]'}

我不能更准确,因为我不知道你的JSON文件中有什么,但那应该让你进入大球场。

此外,除非您将changefile.sub指定给某个内容,否则替换将被丢弃。你可以做以下两件事之一:

changefile = changefile.sub(%r{var json = '\[.+\]'}, json)

或mutate changefile

changefile.sub!(%r{var json = '\[.+\]'}, json)