2015-01-28 3 views
0

Привет это то, что я пытаюсь сделать:можно ли отредактировать одну и ту же строку дважды в том же ruby_block, используя 2 вызова FileEdit? [Повар]

ruby_block "modify line" do 
    block do 
    file= Chef::Util::FileEdit.new("/someExistingFile.txt") 
    file.insert_line_if_no_match(/^11$/, "#this is a comment\n#11") 
    file.search_file_replace_line(/^#11$/, "11") 
    file.write_file 
    end 
end 

После применения кулинарной она добавляет «11», но я не вижу «# Это комментарий» линия.

Можно ли последовательно запускать эти две строки?

file.insert_line_if_no_match(/^11$/, "#this is a comment\n#11") 
file.search_file_replace_line(/^#11$/, "11") 

Ожидаемые результаты [someExistingFile.txt]:

#this is a comment 
11 

Фактический выход [someExistingFile.txt]:

11 

Кроме того, я изменил его вокруг, как это:

file.insert_line_if_no_match(/^11$/, "#this is a comment\n#11") 
file.search_file_replace_line(/^#this is a comment$/, "this is a comment") 

Ожидаемый результат [сом eExistingFile.txt]:

this is a comment 
#11 

Фактический выход [someExistingFile.txt]:

this is a comment 

Кажется, что даже жесткая новая линия добавил был \nsearch_file_replace_line думает, как и как 1 линия !! Зачем?

+0

Извините, может быть, это уже поздно, и я не думаю, что это ясно. Можете ли вы дать нам краткую выборку исходного файла, ожидаемого конечного состояния и конечного состояния, которое вы фактически получаете? Благодарю. –

+0

Я добавил конечную точку и то, что я на самом деле получаю. – david

ответ

1

FileEdit работает с линией, как массив, я постараюсь дать представление о том, что сделано в коде

file.insert_line_if_no_match(/^11$/, "#this is a comment\n#11") 

Глядя на код этой линии будет добавить одну запись в массив (с кареткой вернуться внутрь, но это еще одна запись) Code here в методе append_line_if_missing

file.search_file_replace_line(/^#11$/, "11") 

Этот метод заменит запись, если она соответствует Code here в методе replace_lines

Что здесь не очевидно, так это то, что ваше регулярное выражение с начальными и конечными анкерами соответствует из-за \n, но это вся запись массива, которая заменяется новым текстом, а не только строкой.

Не уверен, что я действительно понимаю свое объяснение, но надеюсь, что это даст некоторый свет.

+0

да, это имеет смысл! Знаете ли вы, есть ли способ добиться желаемых результатов? – david

+0

Я бы использовал два ruby_block ... или, может быть, вызвал файл 'file.write_file', и снова откроет файл между двумя операциями. Poke @coderanger, поскольку у него может быть лучший способ (он лучше меня, играя с внутренним кодом шеф-повара и продвинутым рубином) – Tensibai