простая команда для удаления заголовка и нижнего колонтитула из файла

Мне нужна простая небольшая команда, чтобы удалить XML-заголовок и нижний колонтитул из файла:

<?xml version="1.0" encoding="UTF-8"?> <conxml> <MsgPain001> <HashValue>A9C72997C702A2F841B0EEEC3BD274DE1CB7BEA4B813E030D068CB853BCFECA6</HashValue> <HashAlgorithm>SHA256</HashAlgorithm> <Document> ... </Document> <Document> ... </Document> </MsgPain001> </conxml> 

Должна стать просто

 <Document> ... </Document> <Document> ... </Document> 

(обратите внимание на отступы, отступ от первого тега документа должен быть удален.

Это звучит как (жадное) регулярное выражение

 <Document>.*</Document> 

Но я не получаю это из-за строк.

Может ли кто-нибудь предоставить простой сценарий sed или аналогичный, чтобы получить его?

Мне нужно это в трубе, чтобы вычислить хэш над содержащимися документами.

  • Использование sed с переменной:
  • Как использовать awk или sed для преобразования csv в более читаемый формат
  • Извлечение значений из блока данных
  • Избавление от линии с идеальным совпадением (не подстрокой) с помощью sed
  • find -exec sed, чтобы найти / заменить строку многократного использования
  • Самый быстрый и самый основной способ заменить «\ r \ n» на «\ n» в файле?
  • строки в столбцы с awk
  • Заменить текст многострочным шаблоном
  • 2 Solutions collect form web for “простая команда для удаления заголовка и нижнего колонтитула из файла”

    Использование sed :

      sed -n '/<Document>/,/<\/Document>/ p' yourfile.xml 

    Объяснение:

    • -n делает sed тихим, то есть он не выводит все содержимое файла,
    • /pattern/ ищет строки, включая указанный шаблон,
    • a , b (запятая) сообщает sed выполнить действие на строках от a до b (где a и b определяются путем сопоставления вышеупомянутых шаблонов),
    • p означает печать и действие, выполняемое на линиях, соответствующих указанным выше.

    Изменить: если вы хотите дополнительно отформатировать пробел перед <Document> , это можно сделать следующим образом:

      sed -ne '/ <Document>/s/^ *//' -e '/<Document>/,/<\/Document>/ p' yourfile.xml 

    Чтобы предотвратить разделение текста между </Document> и следующим <Document> вам, возможно, придется использовать серию sed команд (см. Комментарий Gilles выше).

    По сути sed считывает весь файл в буфер хранения (так что содержимое файла можно рассматривать как одну строку) и маркирует первый и последний теги Document для дальнейшей обработки.

     # version 1 # marker: HERE cat file.xml | sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HERE\1HERE/g;p;}' | sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' | sed -e 's/^ *HERE\(<Document>\)/\1/' -e 's/\(<\/Document>\)HERE *$/\1/' # version 2 (using the Bash shell) # marker: $'\001' cat file.xml | sed -n $'1h;1!H;${;g;s/\\(<Document>.*<\\/Document>\\)/\001\\1\001/g;p;}' | sed -n -e $'/\001<Document>/,/<\\/Document>\001/ p' | sed -e $'s/^ *\001//' -e $'s/\001 *$//' | cat -vet 

    … но я думаю, все это можно было бы сделать более элегантно (и надежно) с помощью xmlstarlet !

    Interesting Posts

    Запуск службы перед входом в систему

    / dev / tcp не присутствует в Linux

    Как удалить все экземпляры определенного символа из текстового файла?

    Zsh запрашивает полную ширину с пользовательским вводом в следующей строке

    Lightdm greeter: не работает внутри диспетчера дисплеев, XDG_SEAT_PATH не определен

    Значительная часть используемой памяти не учитывается пользовательскими процессами

    VBox на безголовом сервере: установить linux без RDP

    Получить в реальном времени stdout из контейнера докера на удаленно выполненной команде

    Можно ли добавить Windows в мой загрузчик systemd-boot, если у меня есть отдельные разделы EFI?

    Выход ssh трубы (stderr и stdout) в разные команды

    Команда Bash: возможно ли передать аргумент перед пользовательской командой (функцией) или она должна быть только после:

    Шаблон Grep для извлечения строк, где второе слово имеет только две гласные

    Почему я получаю ошибки об неупакованных файлах при попытке построить rpm?

    Подсчитайте число 0 и 1 в файле

    Как отформатировать и установить большой раздел с размером сектора 4k в Freebsd?

    Linux и Unix - лучшая ОС в мире.