Эта sed
команда:
sed -n -r 'H; ${g; s/([^}]|\}[^%])*%\{//; s/\}%([^%]|%[^{])*//; p}'
соберет весь ввод в пространство шаблона, затем удалит ...%{
(заботясь о том, чтобы ...
не содержал }%
) и }%...
(заботясь о том, чтобы ...
не содержит %{
), а затем выведите результат. Так что это подходит для случая, когда вам нужен только один блок. Случай с несколькими блоками сложнее, но я подумаю над этим и уточню этот ответ, если мне это удастся.
Обратите внимание, что -r
(для поддержки расширенных регулярных выражений вместо базовых) является расширением GNU для sed
, поэтому, если вы используете не-GNU sed
, который его не поддерживает, я знаю.
Отредактировано, чтобы добавить: О.К., вот версия, которая поддерживает несколько блоков:
sed -n -r 'H; ${g; s/^([^}]|\}[^%])*%\{//; s/\}%([^%]|%[^{])*$//; s/\}%([^%]|%[^{])*([^}]|\}[^%])*%\{/\n/g; p}'
Он использует по существу тот же подход, что и предыдущий, за исключением того, что он удаляет только ...%{
в начале ввода и }%...
в конце ввода, а после этого он удаляет все экземпляры }%...%{
, которые не содержат %{...}%
, заменяя их символом новой строки.