我是ruby的新手,希望有人可以帮我弄清楚如何打开文件,然后使用gsub查找并替换多个条件。
这是我到目前为止所得到的,但这似乎不起作用,因为第二个替换var会覆盖第一个:
text = File.read(filepath)
replace = text.gsub(/aaa/, "Replaced aaa with 111")
replace = text.gsub(/bbb/, "Replace bbb with 222")
File.open(filepath, "w") {|file| file.puts replace}
答案 0 :(得分:27)
将第三行更改为
replace = replace.gsub(/bbb/, "Replace bbb with 222")
答案 1 :(得分:16)
您每次都要从原来的“文本”替换,第二行需要替换替换:
replace = replace.gsub(/bbb/, "Replace bbb with 222")
答案 2 :(得分:9)
有趣的是,如果您不想重新扫描数据,请使用gsub的块形式:
replace = text.gsub(/(aaa|bbb)/) do |match|
case match
when 'aaa': 'Replaced aaa with 111'
when 'bbb': 'Replace bbb with 222'
end
end
这可能不是最有效的做事方式,但这是看待问题的另一种方式。如果性能对您很重要,那就值得对两种方式进行基准测试。
答案 3 :(得分:2)
我可能会像这样写出来......
#!/usr/bin/env ruby
filepath = '/tmp/test.txt'
File.open filepath, 'w' do |f|
$<.each_line do |line|
f.puts line.gsub(/aaa/,
'Replaced aaa with 111').gsub /bbb/, 'Replace bbb with 222'
end
end
答案 4 :(得分:2)
这是一个单线
IO.write(filepath, File.open(filepath) {|f| f.read.gsub(/aaa|bbb/) {|m| (m.eql? 'aaa') '111' : '222'}})
IO.write
默认情况下截断给定文件,因此如果您先读取文本,请执行正则表达式String.gsub
并在块模式下使用File.open
返回结果字符串,它将替换文件的内容。好漂亮吧?
它也适用于多行:
IO.write(filepath, File.open(filepath) do |f|
f.read.gsub(/aaa|bbb/) do |m|
(m.eql? 'aaa') '111' : '222'
end
end
)
答案 5 :(得分:0)
对@steveRoss的答案的另一个很好的扩展,使用变量:
aktivBold = 'AktivGrotesk_Bd.ttf'
clarityBold = 'Clarity-Bold.otf'
files.each do |file_name|
text = File.read(file_name)
replace = text.gsub(/(#{aktivBold}|#{aktivLight}|#{aktivMedium})/) do |match|
case match
when aktivBold
clarityBold
when aktivLight
clarityLight
when aktivMedium
clarityMedium
end
end
File.open(file_name, "w") { |file| file.puts replace }
end
这些不是字符串文字,而是变量