2013-04-20 2 views
2

Я пытаюсь заменить две последовательные строки в файле своим текстом. Например:
testfile.rbsed - заменить несколько последовательных строк, соответствующих шаблону

class Test 
    def procedure 
    nil 
    end 
end 

Я пытаюсь добиться этого:
testfile.rb

class Test 
    def procedure 
    nil 
    finish 
finish 

Так что мне нужно заменить последние 2 линии, но это Безразлично» т:

sed -i 's/^\s\send\nend/ finish\nfinish/' testfile.rb 

Я понимаю, что он терпит неудачу, потому что замена выполняется по строкам. Но как я могу это сделать?

ответ

3
sed '/end$/N;//s/end/finish/g' testfile.rb 

Результат

class Test 
    def procedure 
    nil 
    finish 
finish 
  • мы хотим посмотреть на пару строк только тогда, когда они могут и содержать end, так только для чтения во второй строке, когда первая строка заканчивается end
  • заменить end на finish
+0

Понял. Большое спасибо! Ваше последнее изменение короче, но труднее читать для меня. Но и менее гибкая. Может быть, оставить оба варианта? – leemour

+0

'sed -i '/ end $/{N; s/end \ nend/finish \ nfinish /} 'testfile.rb' работает лучше для меня – leemour

1
perl -i -0777 -pe 's/\bend\s*\n\s*end$/finish\nfinish/ms' testfile.rb 

Этот фрагмент работает в многострочном режиме. sed - одна строка, основанная по умолчанию.

+0

Работает отлично, но это Perl не sed. Спасибо, в любом случае. – leemour

0

Другой способ:

sed 'N;s/^ end\nend$/ finish\nfinish/;t;P;D' testfile.rb 

С гибким отступа:

sed 'N;s/^\(*\)end\n\(*\)end$/\1finish\n\2finish/;t;P;D' testfile.rb 

Для еще более гибкого отступа, изменения пространства в [[:space:]].

Смежные вопросы