У меня есть несколько файлов, которые я хочу обновить, заменив одну многострочную строку другой многострочной. Что-то вроде:
* Some text,
* something else
* another thing
И я хочу заменить его на:
* This is completely
* different text
В результате будет получено, что после замены файл, содержащий первый блок текста, теперь будет содержать вторую строку (остальная часть файла не изменяется).
Часть проблемы заключается в том, что мне нужно найти список файлов, которые будут обновлены в файловой системе. Я думаю, я могу использовать grep для этого (хотя опять-таки это не так просто сделать с многострочными строками), а затем передать его в sed, может быть?
Есть простой способ сделать это? Sed - вариант, но он неудобен, потому что я должен добавить \ n и т. Д. Есть ли способ сказать «взять входные данные из этого файла, сопоставить их в этих файлах, а затем заменить их содержимым этого другого файла»? Я могу использовать python, если это необходимо, но я хочу что-то быстрое и простое, поэтому, если есть доступная утилита, я бы лучше использовал ее, чем написал свой собственный скрипт (который я знаю, как это сделать).
some text, something else another thing
, занимает ли он несколько строк? Или вы только хотите соответствоватьsome text,\nsomething else\nanotherthing
?Ответы:
Замените "Some ... \ n ... Thing" содержимым файла "new" в одном или нескольких входных файлах.
-i
изменить input.txt напрямую-p0
прихлебывать входной файл и распечатывать его в концеs/regexp/.../s
в регулярном выражении.
является.|\n
s/.../exp/e
заменить наeval(exp)
s/Some text\n...\n...thing\n/...
источник
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Боюсь, вам будет трудно найти решение, которое подходит вам, пока вы не разработаете конкретное описание проблемы, но именно для этого лучше всего подходит QA, как я понимаю. Может быть, это даст вам идею - он всегда будет держать 3 строки в шаблонном пространстве за раз - с 2-строчной перспективой - при этом скользя вперед по входному файлу только на строку за раз.
Он должен соответствовать вашей строке независимо от того, занимает ли она несколько строк или нет - до трех, то есть. Но нет никаких положений для отражения этого положения в замене - оно всегда занимает две строки, как написано.
источник
Не к сильному (потому что не проверяйте вторую строку, но это легко установить) и может быть не компилятором posix, но очень простым:
Первая команда добавляет строки из некоторого текста, пока не встретит другую вещь, затем вторая строка изменит его на другой текст
ПРИМЕЧАНИЕ. Ограничение заключается в том, что за некоторым текстом всегда должна следовать другая вещь .
источник