LINUX.ORG.RU

Замена с помощью sed нескольких строк в файле.

 


0

1

Всем привет!

Не очень понимаю, как использовать для поиска и замены с помощью sed шаблон, состоящий из нескольких строк.

Есть file1:

$ cat file1 
string file001
!<ooo;\\ Hello ,,,-+ii!
br>re
string file001
string file001

Есть file2:

$ cat file2
string file2
string file2
string file2

Требуется заменить в файле1 строки:

!<ooo;\\ Hello ,,,-+ii!
br>re

Содержимым файла file2.

Если делать замену одной строки, то всё хорошо:

$ sed '/\!<ooo;\\\\ Hello ,,,-+ii\!/ {
r file2
d}' file1

string file001
string file2
string file2
string file2
br>re
string file001
string file001

Если добавить \n и вторую строку, то замены не происходит:

$ sed '/\!<ooo;\\\\ Hello ,,,-+ii\!\nbr>re/ {
r file2
d}' file1
string file001
!<ooo;\\ Hello ,,,-+ii!
br>re
string file001
string file001

Спасибо



Последнее исправление: welken (всего исправлений: 1)

Ответ на: комментарий от Yorween

Спасибо! Да, такое решение в данном случае подходит, но что если мы выполняем поиск и замену рекурсивно, и могут встретиться такие файлы, как:

$ cat file1 
string file001
!<ooo;\\ Hello ,,,-+ii!
string file001
string file001

В этом случае замена будет произведена, а это не совпадает с исходным условием замены строк:

!<ooo;\\ Hello ,,,-+ii!
br>re
welken
() автор топика
Ответ на: комментарий от welken

Хотя мы можем с помощью grep и find найти файлы, содержащие только

!<ooo;\\ Hello ,,,-+ii!
br>re

После чего работать только с ними.

welken
() автор топика
Ответ на: комментарий от welken

Если замена нужна обязательно двух строк подряд, то да. Проще сначала грепом получить необходимый список файлов, а потом производить замену.

Yorween
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.