Вам следует избегать использования sed
, который является линейным инструментом и плохо справится с этим видом задачи.
Если вы настаиваете на использовании sed
и используете GNU sed
, выоднако можно использовать опцию -z
/ --null-data
, которая будет считывать весь файл за один проход (чтение записей, разделенных NUL-байтами, а не записями, разделенными строкой) и позволит вам использовать шаблон )\n{
, как и следовало ожидать:
$ { echo "line1)"; echo "{line2"; } | sed -z 's/)\n{/X/g'
line1Xline2
Поскольку для этого требуется загрузка всего файла в память, ожидайте ужасных результатов при работе с огромными файлами.
Если вам нравится неуправляемый бред, вы можете решить эту проблему с помощью sed
Менее известные команды P
, t
и D
:
sed '/)$/{N;s/)\n{/) {\n\ttime_exe(__func__, cl(clock()));/;t;P;D}'
Попробуйте здесь!
Это работает путем загрузки дополнительной строки впространство образца (N
), когда встречается строка, оканчивающаяся на )
, при попытке замены на шаблон с двумя линиями, печати (P
) и удалении (D
) первой строки из пространства образцаесли шаблон не соответствует (в противном случае t
переходит к следующей итерации), оставляя вторую строку в пространстве шаблона для использования в качестве первой строки следующей итерации.
Использование /first line pattern/{N;s/whole pattern/replacement/}
часто достаточно хорошо, но может привести к сбоюпоскольку N
будет использовать строку, с которой вы не будете проверять шаблон первой линии.Это иллюстрируется здесь .