我正在使用linux命令生成文件"a.txt"。现在我需要读取文件"a.txt"的第一个单词并更新一个名为"b.txt"的现有文件。我将在 b 中搜索一个名为"/fill "的单词.txt并将其替换为从 a 读取的单词.txt 下面是代码
bash 'example' do
code <<-EOH
cat ex.txt >> a.txt
EOH
end
test = /#{'cat /a.txt'}/
file_names = ['/b.txt']
file_names.each do |file_name|
text = File.read(file_name)
new_contents = text.gsub(/fill, test)
puts new_contents
File.open(file_name, "w") {|file| file.puts new_contents }
- 在linux命令"cat ex.txt>>a.txt"的帮助下,我将ex.txt的内容放在a.txt。
- 在此之后,我想读取文件 a.txt 测试 =/#{'cat/a.txt'}/。示例 a.txt包含"azure"字 样现在在 b 中.txt我想
- 搜索一个单词"/fill"并替换为步骤 2 中从 b.txt 文件即 azure 中读取的内容
- 问题不是用 azure 替换/fill,而是用 cat/a.txt 替换。希望现在清楚了
你能在这里帮忙吗
这
有点难以理解,你真正想要实现的目标。您的代码有几个问题。一般建议:
- 将 Ruby 代码放入
ruby_block
资源中,以便在 Chef 的收敛阶段执行 - 如果要编辑不完全由 Chef 管理的文件,请使用
Chef::Util::FileEdit
(请参阅此问题以获取更多灵感((。 - 如果您确实想使用 Chef 编写完整的文件,请使用
file
资源并根据您使用File.read
读取的内容指定content
。 如前所述,
ruby_block
之外的 Ruby 代码在编译阶段(收敛阶段之前(执行。如果还为时过早(因为源文件尚未存在,则可以使用lazy
块进行延迟计算:file "b.txt" do content lazy { File.read .. } end