3

У меня есть несколько огромных текстовых файлов XML. Мне нужно написать скрипт, чтобы найти и распечатать только конкретный тег. Я пробовал sed и grep но они оба возвращают всю строку.

Использование SunOS 5.x, поэтому не все команды Linux могут работать. grep -o не доступен.

Файл 'xml' на самом деле не является одним огромным XML-документом, но каждая строка представляет собой отдельный XML-документ, содержащий всего несколько тегов, даже не вложенных. И структура довольно проста, поэтому полные парсеры xml не нужны и, вероятно, не будут работать.

Я искал sed , awk или другие лайнеры, но не смог заставить их работать, и они оба относительно новы для меня.

4 ответа4

2

Используйте команду xml sel команды xmlstarlet: http://xmlstar.sourceforge.net/

Пример:

xml sel -t -c '/xpath/to/my/tag' xmlfile.xml

Остерегайтесь пространства имен по умолчанию в вашем XML-файле (прочитайте это). Пример:

xml sel -N x="http://www.mozilla.org/2006/browser/search/" -t -m '//x:Param' -c "." -n /usr/lib/firefox-3.5/searchplugins/google.xml

Сейчас я использую xmlstarlet для всех задач xml, в основном для запросов.

2
$ echo '<a><b>B</b><c>C</c></a>' > file.xml
$ perl -ne 'm!<b>(.*)</b>! && print "$1\n"' *.xml
B

$ perl -ne 'BEGIN{$/="<"}; print "$1\n" if m![bc]>([^<]+)<!' *.xml
B
C

Но на самом деле вы должны использовать парсер XML по причинам, которые должны быть (или станут) слишком очевидными.

2

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

Учитывая простую строку, такую как <foo>bar</foo><baz>qux</baz> и вам нужно значение "bar", вы можете сделать это:

sed -e 's|.*<foo>\([^<]*\)</foo>.*|\1|' inputfile
1

Две идеи:

  1. установить grep с сайта sunfreeware.com. Это должно дать вам опцию -o, которую вы знаете из linux.

  2. написать Perl или Python скрипт, чтобы сделать работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .