Что-то вроде этого может работать (GNU sed):
sed -Ez 's:(<\\section>)[[:space:]]+\1:</section>:'
Работает с простым тестовым документом после изменения \section на требуемое соответствие /section
Использование GNU sed для -E
, -z
и \s
:
$ sed -Ez 's:(<\\section>)\s*\n\s*\1:</section>:g' file
</section>
Это позволит использовать несколько пустых строк или строк пробелов между двумя вхождениями <\section>
, если это нежелательно, замените каждый \s
на [[:blank:]]
. Он также сразу прочитает весь ввод в память.
Это может сработать для вас (GNU sed):
sed -E 'N;s/(<\\section>)\s*\n\s*\1/</section>/;P;D' file
Откройте двухстрочное окно и с помощью сопоставления с образцом подставьте нужную строку.
Кажется, это работает нормально, после изменения соответствия \\section на /section
1)
\n
уже включен в[:space:]
, поэтому[[:space:]\n]
=[[:space:]]
, 2) это регулярное выражение будет соответствовать нескольким<\section>
в одной строке или со многими строками пробелов между ними, что может быть нежелательно, 3) OP хочет вывести</section>
, а не<\section>
, поэтому вы не можете использовать\1
в замене, 4) у вас есть:
s в классе символов, поэтому также использование:
s в качестве разделителя в лучшем случае запутывает код (на самом деле я ожидал, что он сломается, но я не т проверял).