Ruby在文件中找到一行并在其下面添加

时间:2017-01-04 06:22:16

标签: ruby chef chef-recipe

我有一个文本文件,我需要在厨师食谱中编辑。 我需要找到这个特定的行(粗体),并在其下面插入配置。

.
.
.
# PLACE YOUR CONFIGURATION MEMORY start up here :
<INSERT MEMORY ARGUMENTS HERE>
.
.
.
.

以下是我一直在尝试的内容。我想知道Ruby中是否存在某种功能 在哪里可以找到一条线然后在该线下方添加新条目?

ruby_block "edit the configuration file " do
  block do 
    text = File.read(file_name)
    replace = text.sub(/# PLACE YOUR CONFIGURATION MEMORY start up here :/, "MEM_ARGS=-Xms512m -Xmx1024m");
    File.write(file_name, replace)
  end
end

我不想替换评论部分,我只是想利用它作为锚点,我可以添加新的文本行。

2 个答案:

答案 0 :(得分:3)

在Chef中执行此操作的正确方法是line食谱,其中包含用于管理此类就地文件操作的资源。但是,我们强烈建议不要使用它,因为使用非收敛系统编写错误的正则表达式或其他东西很容易。使用template资源管理整个文件是首选。

答案 1 :(得分:2)

试试这个

File.open('input') do |i|
  File.open('output', 'w') do |o|
    while line = i.gets
      o.puts line
      if line.chomp == "# PLACE YOUR CONFIGURATION MEMORY start up here:"
        o.puts "MEM_ARGS=-Xms512m -Xmx1024m"
      end
    end
  end
end
`mv output input`

这是如何运作的?

  • 首先打开输入文件,如果它不存在,将失败{/ 1}
  • 然后打开输出文件
  • 逐行播放
  • 在标记行后插入其他行,Errno::ENOENT删除尾随换行符
  • chomp块自动关闭两个文件
  • 最终用do end
  • 替换输入