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

Мне нужна простая небольшая команда, чтобы удалить 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 или аналогичный, чтобы получить его?

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

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 !

  • Строки соответствия, начинающиеся с одного шаблона в двух текстовых файлах
  • Рекурсивно заменить строку в файлах
  • Получение раздела данных с максимальным элементом
  • Как добавить содержимое текстового файла в середину другого текстового файла
  • Объяснение для 'sed'
  • Захват в переменных оболочки аргументов после команды (между скобками)
  • Sed удалить строку, если n-й символ не является конкретным символом
  • Как поймать все после префиксной фразы с SED?
  • удалите первую строку файла, только если пустой с помощью sed
  • Заменить только первый символ совпадающего шаблона
  • Как я могу группировать числа в файле
  • grep шаблон перед другим шаблоном и распечатать все
  • Linux и Unix - лучшая ОС в мире.