Извлечение данных из простого XML-файла

У меня есть XML-файл с содержанием:

<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>

Мне нужен способ извлечь то, что находится в <job..> </job> теги, программируя в этом случае. Это должно быть сделано на командной строке Linux, с помощью grep/sed/awk.

40
задан amarillion 8 February 2010 в 14:34
поделиться

6 ответов

Вы действительно должны использовать только эти инструменты? Они не предназначены для обработки XML, и хотя в большинстве случаев можно получить что-то, что работает нормально, в крайних случаях, таких как кодирование, разрывы строк и т. Д., Это не поможет.

Я рекомендую xml_grep:

xml_grep 'job' jobs.xml --text_only

Который дает результат:

programming

В ubuntu / debian xml_grep находится в пакете xml-twig-tools.

63
ответ дан 27 November 2019 в 01:13
поделиться
 grep '<job' file_name | cut -f2 -d">"|cut -f1 -d"<"
12
ответ дан 27 November 2019 в 01:13
поделиться

просто используйте awk, другие внешние инструменты не нужны. Ниже работает, если желаемые вами теги появляются в многострочности.

$ cat file
test
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">
programming</job>

$ awk -vRS="</job>" '{gsub(/.*<job.*>/,"");print}' file
programming

programming
8
ответ дан 27 November 2019 в 01:13
поделиться

Как насчет:

cat a.xml | grep '<job' | cut -d '>' -f 2 | cut -d '<' -f 1
0
ответ дан 27 November 2019 в 01:13
поделиться

Предполагается, что та же строка, ввод из стандартного ввода:

sed -ne '/<\/job>/ { s/<[^>]*>\(.*\)<\/job>/\1/; p }'

примечания: -n останавливает вывод все автоматически; -e означает, что это однострочный (а не сценарий) / <\ / job> действует как grep; s удаляет атрибуты opentag + и endtag; ; - новый оператор; p отпечатки; {} заставляет grep применяться к обоим операторам как к одному.

5
ответ дан 27 November 2019 в 01:13
поделиться

Using xmlstarlet:

echo '<job xmlns="http://www.sample.com/">programming</job>' | \
   xmlstarlet sel -N var="http://www.sample.com/" -t -m "//var:job" -v '.'
10
ответ дан 27 November 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: