У меня есть XML-файл с содержанием:
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
Мне нужен способ извлечь то, что находится в <job..>
</job>
теги, программируя в этом случае. Это должно быть сделано на командной строке Linux, с помощью grep/sed/awk.
Вы действительно должны использовать только эти инструменты? Они не предназначены для обработки XML, и хотя в большинстве случаев можно получить что-то, что работает нормально, в крайних случаях, таких как кодирование, разрывы строк и т. Д., Это не поможет.
Я рекомендую xml_grep:
xml_grep 'job' jobs.xml --text_only
Который дает результат:
programming
В ubuntu / debian xml_grep находится в пакете xml-twig-tools.
grep '<job' file_name | cut -f2 -d">"|cut -f1 -d"<"
просто используйте 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
Как насчет:
cat a.xml | grep '<job' | cut -d '>' -f 2 | cut -d '<' -f 1
Предполагается, что та же строка, ввод из стандартного ввода:
sed -ne '/<\/job>/ { s/<[^>]*>\(.*\)<\/job>/\1/; p }'
примечания: -n
останавливает вывод все автоматически; -e
означает, что это однострочный (а не сценарий) / <\ / job>
действует как grep; s
удаляет атрибуты opentag + и endtag; ;
- новый оператор; p
отпечатки; {}
заставляет grep применяться к обоим операторам как к одному.
Using xmlstarlet:
echo '<job xmlns="http://www.sample.com/">programming</job>' | \
xmlstarlet sel -N var="http://www.sample.com/" -t -m "//var:job" -v '.'