2016-07-15 4 views
1

Может ли помочь мне написать скрипт, чтобы найти значение из приведенного ниже XML: -Shell Скрипт для извлечения значения из файла XML

<?xml version="1.0" encoding="UTF-8"?> 
<log> 
<logentry revision="36"> 
    <author>XYZ</author> 
    <date>2014-07-15T14:47:18.328479Z</date> 
    <paths> 
     <path action="A" localPath="ABC" kind="unknown">/branches/ABC</path> 
     <path action="A" localPath="ABC" kind="unknown">/branches/ABC</path> 
     <path action="M" localPath="DEF" kind="unknown">/branches/CDF</path> 
     <path action="M" localPath="DEF" kind="unknown">FRG</path> 
    </paths> 
    <msg>added</msg> 
</logentry> 
</log> 

Я хочу, чтобы извлечь значение LocalPath т.е. " ABC "и" DEF "в качестве вывода и записи в одном файле.

+0

BTW, да ** действительно ** есть два добавления, а затем две разные модификации одного и того же файла? Интересно, является ли воспринимаемая необходимость в «sort -u» шаге артефактом вашей анонимности, а не тем, что когда-либо могло произойти с подлинными данными. –

ответ

2

Используйте инструмент, поддерживающий XML. Например:

$ xmllint --xpath '/log/logentry/paths/path/@localPath' file.xml 

Выход:

localPath="ABC" localPath="ABC" localPath="DEF" localPath="DEF" 

который можно дополнительно обработать

$ xmllint --xpath '/log/logentry/paths/path/@localPath' file.xml \ 
    | sed 's/"/\n/g;' \ 
    | grep -v '^ ' \ 
    | sort -u 

получить

ABC 
DEF 

или с помощью xsh

open file.xml ; 
$h := hash @localPath /log/logentry/paths/path ; 
for { keys %$h } { echo (.) ; } 

Выход:

ABC 
DEF 
+0

Является ли формат вывода для 'xmllint -xpath' документированным с достаточно сильными гарантиями, чтобы сделать следующее строковое манипулирование передовым? –

+0

@CharlesDuffy: Я не знаю, поэтому я включил вывод здесь тоже. – choroba

+0

@choroba: Спасибо за ваш ответ. Я попытался запустить команду xmllint --xpath '/ log/logentry/paths/path/@ localPath' file.xml, но кажется, что -xpath недоступен. Это дает мне неизвестный вариант ошибки --xpath. Можете ли вы сказать мне, чтобы исправить это, или мне нужно использовать любой другой вариант.? – user6376225

1

... или с XMLStarlet:

xmlstarlet sel -t -v /log/logentry/paths/path/@localPath -n 

... излучающие:

ABC 
ABC 
DEF 
DEF 
Смежные вопросы