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

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

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

  • Применение регулярного выражения к stdin
  • Как найти и заменить текст sed, содержащий звездочку *
  • как печатать ближайший столбец при поиске определенных строк
  • Как извлечь XML из текстового файла
  • Заменить текст быстро в очень большом файле
  • Как я могу удалить поле nth в mth с помощью команды awk?
  • Должна стать просто

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

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

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

     <Document>.*</Document> 

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

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

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

  • Замените строку и замените ее частью
  • Печать текста между двумя шаблонами, не содержащими конкретного слова
  • Используя 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 !

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