Рассмотрим следующую выдержку из большого файла XML:
...
<serverName someKey="false" anotherKey="0.05" thirdKey="0.04">
<default>blah.blah.blah</default>
<region name="US">us.blah.net</region>
<region name="EU">eu.blah.net</region>
<region name="IL">il.blah.net</region>
</serverName>
...
Как распечатать строки между открывающим тегом <serverName ...>
и закрывающим тегом </serverName>
?
sed -n '/<serverName/,/<\/serverName/p' big_xml_file.xml
Сделал трюк (адаптировано из этого поста на linuxquestions.org).
На Ubuntu 14.04:
$ sed -n '/<serverName/,/<\/serverName/p' big.xml
<serverName someKey="false" anotherKey="0.05" thirdKey="0.04">
<default>blah.blah.blah</default>
<region name="US">us.blah.net</region>
<region name="EU">eu.blah.net</region>
<region name="IL">il.blah.net</region>
</serverName>
sed
- отличный инструмент, но XML в конечном итоге заставит любого программиста, который обращается к нему с криком REGEX. Я знаю. Я был там. Если есть хоть малейшая вероятность того, что ваши данные изменятся, вам нужен правильный анализатор XML.
Мой выбор - использовать BeautifulSoup, но это затрудняет работу с ним напрямую из Bash. Если вы хотите написать промежуточный скрипт Python, это все еще вариант ... В противном случае xpath
- это довольно классический вариант. Это оболочка библиотеки Perx libxml, которая делает довольно мощные вещи.
sudo apt-get install libxml-xpath-perl
И для вашего примера, вот как я это сделаю в языке запросов xpath :
xpath -e '*/serverName/*' big_xml_file.xml
Опять же, если вам нужно сделать что-нибудь полезное с XML, рассмотрим что-то еще более сильное, например BeautifulSoup и Python.
Я также могу представить, что вам нужно найти конкретный сервер из более длинного списка вместе с конкретными настройками или регионами на основе некоторых заданных условных путей.
В этом случае я бы порекомендовал обернуть ваши операторы и условия XPATH в таблицу стилей XSLT. В репозиториях доступно несколько синтаксических анализаторов XSLT для работы с командной строкой, PHP, Perl, Python, Java и т. Д.
XSLT очень мощный и может выводить текст, XML и HTML.