更新说明更清晰。
说我有一个文件,里面有这些行。
one
two
three
five
如何添加一行代表"四"在说出"三"所以我的文件现在看起来像这样?
one
two
three
four
five
答案 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)
虽然你可以在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