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

Мне нужна простая небольшая команда, чтобы удалить 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, если он содержит регулярное выражение?
  • Использование sed для замены строки, содержащей целые переменные
  • Печатать случайные строки в соответствии с порядком исходного файла
  • Удаление нескольких строк
  • выражение поиска grep и файл переименования
  • Как добавить конец каждой строки с самой линией
  • как я могу использовать sed для замены списков, начинающихся с (*) в файле
  • Объединение нескольких файлов с общим заголовком
  • 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

    Как импортировать оконный менеджер в файл iso base linux

    Клиент Linux, который может взаимодействовать с NetMeeting

    Как исправить шумное устройство ввода (Internal Mic)? snd_hda_intel – включена отладка

    Как определить, почему машина работает медленно?

    Ошибка Wget TLS 1.2

    firefox -private иногда открывает не-личное окно

    Сохранять историю tcsh в нескольких окнах терминала

    Открыты ли файлы процессами, загруженными в ОЗУ?

    Как заставить rpm проверять зависимости во время обновления?

    Какой сигнал отправляется, когда вы закрываете терминал bash для запущенных программ

    копировать файлы удаленно на одном пути

    Как получить текст между двумя словами, указанными их индексами?

    Yum Проверить доступные обновления пакетов

    В чем смысл состояния UNCLEAN в iptables

    хотите скопировать несколько файлов * .txt из нескольких каталогов в один и тот же каталог, но переименуйте новый файл

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