如何在Ruby中的文件中的另一行之后添加一行?

时间:2015-01-23 21:55:28

标签: ruby chef

更新说明更清晰。

说我有一个文件,里面有这些行。

one
two
three
five

如何添加一行代表"四"在说出"三"所以我的文件现在看起来像这样?

one 
two
three
four
five

5 个答案:

答案 0 :(得分:9)

假设您要使用FileEdit类执行此操作。

Chef::Util::FileEdit.new('/path/to/file').insert_line_after_match(/three/, 'four')

答案 1 :(得分:0)

这是在比赛之后插入2行新代码的示例红宝石块:

ruby_block "insert_lines" do
  block do
    file = Chef::Util::FileEdit.new("/path/of/file")
    file.insert_line_after_match("three", "four")
    file.insert_line_after_match("four", "five")
    file.write_file
  end
end

insert_line_after_match搜索正则表达式/字符串,它将在匹配项之后插入值。

答案 2 :(得分:-1)

这是内存解决方案。它寻找完整的行而不是进行字符串正则表达式搜索...

def add_after_line_in_memory path, findline, newline
  lines = File.readlines(path)
  if i = lines.index(findline.to_s+$/)
    lines.insert(i+1, newline.to_s+$/) 
    File.open(path, 'wb') { |file| file.write(lines.join) }
  end
end

add_after_line_in_memory 'onetwothreefive.txt', 'three', 'four'

答案 3 :(得分:-1)

以下Ruby脚本应该可以很好地完成您想要的操作:

# insert_line.rb
#   run with command "ruby insert_line.rb myinputfile.txt", where you
#   replace "myinputfile.txt" with the actual name of your input file
$-i = ".orig"
ARGF.each do |line|
  puts line
  puts "four" if line =~ /^three$/
end

$-i = ".orig"行使脚本看起来就地编辑指定的输入文件,并使用" .orig"制作备份副本。附在名称上。实际上,它从指定的文件读取并将输出写入临时文件,并在成功时重命名原始输入文件(具有指定的后缀)和临时文件(具有原始名称)。

这个特定的实现写了"四"找到"三"但是,改变匹配的模式,使其基于计数,或者在某个已识别的行之前写入而不是之后写入将是微不足道的。

答案 4 :(得分:-3)

AWK解决方案

虽然你可以在Ruby中做到这一点,但在AWK中实现这一点实际上是微不足道的。例如:

# Use the line number to choose the insertion point.
$ awk 'NR == 4 {print "four"}; {print}' lines
one
two
three
four
five

# Use a regex to prepend your string to the matched line.
$ awk '/five/ {print "four"}; {print}' lines
one
two
three
four
five