2017-02-15 20 views
1

Я использую команды linux для создания файла «a.txt». Теперь мне нужно прочитать первое слово файла «a.txt» и обновить существующий файл с именем «b.txt». Я буду искать слово под названием «/ заливка» в b.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 } 
  1. с помощью команды Linux «кот ex.txt> > a.txt «Я помещаю содержимое ex.txt в файл a.txt.
  2. После этого я хочу прочитать файл a.txt с тегом =/# {'cat /a.txt'}/. Пример a.txt содержит слово «azure»
  3. Теперь в b.txt Я хочу найти слово «/ fill» и заменить содержимое, прочитанное на шаге 2, из файла b.txt, т.е. azure
  4. Проблема заключается в том, замены/заливки на лазурь,/fill заменяется на cat /a.txt. Надежда его теперь ясно

Можете ли вы помочь здесь

+0

Нет, мы не можем помочь, как это звучит абсолютно контрпродуктивным, почему не работает ли ресурс 'template' и' file' в вашем случае? полагаясь на код bash, должен быть последним средством, когда обычный идемпотентный примитив не может соответствовать. Это звучит как проблема [XY] (http: // meta. stackexchange.com/questions/66377/what-is-the-xy-problem), опишите, что вы действительно делаете, и мы можем помочь с подходами. – Tensibai

+0

@Tensibai, потому что ex.txt генерируется динамически, и мне нужно прочитать Цель состоит в том, чтобы прочитать содержимое динамически созданного файла с именем ex.txt и replac e содержимое файла b.txt на основе определенного поиска слов. Надеюсь, я сделал свою точку зрения – Dave

+0

Не вы этого не сделали, вы не скажете, почему шаблон не подходит для b.txt, и почему вы не должны полагаться на этот ex.txt и не определяете, что вы делаете, целое. – Tensibai

ответ

1

Это немного трудно следовать, что вы на самом деле хотите достичь. У вашего кода несколько проблем. Общие рекомендации:

  • поместить ваш код рубинового внутри ruby_block ресурса таким образом, что выполняется на этапе конвергенции Повара
  • Используйте Chef::Util::FileEdit, если вы хотите редактировать файлы, которые не полностью управляется Chef (см this question для более вдохновения)).
  • Если вы действительно хотите написать полный файл с помощью шеф-повара, используйте ресурс file и укажите content на основе того, что вы прочитали, используя File.read.
  • Как указано, код ruby ​​за пределами ruby_block выполнен на этапе компиляции (which precedes the convergence phase). Если это слишком рано (потому что исходный файл не существует, то вы можете использовать lazy блок для ленивой оценки:

    file "b.txt" do 
        content lazy { File.read .. } 
    end 
    
+0

Спасибо за ваш ответ. Я переформулировал требования. пожалуйста, помогите здесь – Dave

+0

Очень сложно. Поскольку @Tenisbai сказал, что имеет смысл описать то, что вы на самом деле хотите сделать, не имея в виду решение, которое не считает «шеф-поваром родным» (по крайней мере, для меня). – StephenKing