Если я правильно читаю ваш вопрос (а это нелегко, учитывая его зависимость от других вопросов), вам просто нужно короткое совпадение между двумя заданными регулярными выражениями (которые сами по себе являются строками): <\/messages>
и <\/start>
.
sed '/<\/message>.*<\/start>/ { s:^.*</message>:</message>:; s:</start>.*$:</start>: }'
Используется POSIX sed
, поскольку вы не указали, что используете GNU (например, через дистрибутив Linux). Сначала мы проверяем соответствие строки. Если это так, удалите все до последнего </message>
, а затем удалите все после первого </start>
.
Это было бы более элегантно с GNU (или BSD) sed
, так как вы можете использовать обратные ссылки для сохранения эти теги:
sed -E '/<\/message>.*<\/start>/ { s:^.*(</message>):\1:; s:(</start>).*$:\1: }'
Лично я бы использовал GNU grep (предполагая, что он скомпилирован с libpcre для поддержки -P
):
grep -Po '</message>.*?</start>'
Это будет отображать только соответствующий текст самое короткое совпадение между этими двумя заданными строками.