Sed заменить через предложение в несколько строк

11

Я новичок в использовании sed, но я экспериментировал с sed s/..../..../(заменой), чтобы изменить полное предложение, если оно в одной строке, но я не знаю альтернативного решения о том, как изменить предложение, которое могло быть разделено на две строки, например:

Эта:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

на самом деле написано так:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Как вы можете обнаружить это или закодировать как замену всего предложения, даже если оно состоит из двух строк вместо одной?

DᴀʀᴛʜVᴀᴅᴇʀ
источник
Великий справочник по sed: Полное руководство по sed. Учебное пособие и справочник Дэниела А. Голдмана ISBN: 978-1-939824-01-1 (версия EPUB) 08148804441822
Джо

Ответы:

16

Следующая команда будет работать в обеих ситуациях:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Дополнительные пояснения: как я могу использовать sed для замены многострочной строки?

Раду Рэдяну
источник
3
@ Жиль, я понимаю твои благие намерения, но, пожалуйста, попробуй проверить, прежде чем испортить мой ответ. Лучше, если у вас есть другое мнение, это добавить другой ответ или оставить комментарий.
Раду Рэдяну
Добро пожаловать в Stack Exchange. Этот сайт редактируется совместно. Если вас не устраивает идея, что ваши материалы будут совместно редактироваться другими доверенными пользователями, возможно, этот сайт не для вас. Я заметил , что ваш код заменить более конкретную фразу , которая была предназначена, так что я редактировал фразу.
Жиля SO- перестать быть злой »
@ Жиль Пожалуйста, тебе не нужно быть озорным. Вы должны также заметить, что ваш «код» не заменил абсолютно ничего . Как я уже сказал, я понимаю ваши добрые намерения. Из моего примера я полагаю, что ОП, чтобы понять, как заменить предложение на несколько строк sed, не более того. И это заглавный вопрос. Название не про perl.
Раду Рэдяну
Нет, код, который я разместил, работает. (За исключением случаев, когда Loremв последней строке указан дефект, который он разделяет с вашей версией.)
Жиль, "ТАК, перестань быть злым"
Этот пример не работает, когда есть 3 или более строк текста :(
artnikpro
12

Хотя sed может сопоставлять шаблоны на нескольких строках (используя команды Nили Hдобавлять последовательные строки перед сопоставлением), это далеко за пределами его зоны комфорта. Попытайтесь, только если вы любите боль.

Perl может делать такие вещи хорошо. Используйте этот -pпереключатель, чтобы он обрабатывал стандартный ввод по одной записи за раз и печатал измененную запись (по типу sed), а -000также включал режим абзаца (где записи разделены пустыми строками). В регулярном выражении \sсоответствует любому символу пробела, включая символ новой строки.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Если вы хотите поместить новую строку в тексте замены, когда он содержится в оригинале, это более сложно. Как это сделать, зависит от ваших требований относительно того, куда поместить новую строку.

Жиль "ТАК - перестань быть злым"
источник
@terdon Ах, я хотел разрешить несколько пробелов, но забыл. Спасибо, исправлено.
Жиль "ТАК - перестань быть злым"
Вопрос о sed. Это также помечено sed, а не с perl.
Раду Рэдяну
0

sed не может легко читать несколько строк. Используйте perl -i -0pe 's/.../.../...'вместо этого.

Сделать
источник
7
sed может читать через несколько строк!
Раду Рэдяну
3
@ RaduRădeanu Технически, да. Но это редко стоит хлопот.
Жиль "ТАК - перестать быть злым"
3
@ Жиль Если использовать perlдля вас проще, это не значит, что это sedстоит того.
Раду Рэдяну