Удаление повторяющейся XML-разметки с помощью awk

Ищете замену повторяющимся экземплярам в двух строках, например:

<\section>
     <\section>

с одной записью </section>.

Количество пробелов во входном файле может варьироваться.

Если это можно сделать с помощью sed, тем лучше. Но, может быть, мне нужно использовать awk.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что-то вроде этого может работать (GNU sed):

sed -Ez 's:(<\\section>)[[:space:]]+\1:</section>:'

1) \n уже включен в [:space:], поэтому [[:space:]\n] = [[:space:]], 2) это регулярное выражение будет соответствовать нескольким <\section> в одной строке или со многими строками пробелов между ними, что может быть нежелательно, 3) OP хочет вывести </section>, а не <\section>, поэтому вы не можете использовать \1 в замене, 4) у вас есть :s в классе символов, поэтому также использование :s в качестве разделителя в лучшем случае запутывает код (на самом деле я ожидал, что он сломается, но я не т проверял).

Ed Morton 17.04.2023 13:40

Работает с простым тестовым документом после изменения \section на требуемое соответствие /section

mikey 18.04.2023 12:48

Использование 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

mikey 18.04.2023 12:46

Другие вопросы по теме