[英]How do I extract only top level elements in xml tree response in Linux shell script?
[英]How do I extract xml properties using shell scripts?
我已經使用grep從源文檔中提取了標簽,但是現在我似乎無法弄清楚如何輕松地從字符串中提取屬性。 我也想避免必須使用標准安裝中通常不存在的任何程序。
$tag='<img src="http://imgs.xkcd.com/comics/barrel_cropped_(1).jpg" title="Don't we all." alt="Barrel - Part 1" />'
我需要結束以下變量
$src="http://imgs.xkcd.com/comics/barrel_cropped_(1).jpg"
$title="Don't we all."
$alt="Barrel - Part 1"
您可以使用xmlstarlet 。 然后,您甚至不必自己提取元素:
$ echo $tag|xmlstarlet sel -t --value-of '//img/@src'
http://imgs.xkcd.com/comics/barrel_cropped_(1).jpg
您甚至可以將其轉換為功能
$ get_attribute() {
echo $1 | xmlstarlet sel -t -o """ -v $2 -o """
}
$ src=get_attribute $tag '//img/@src'
如果您不想多次重新分析文檔,也可以執行以下操作:
$ get_values() {
eval file=\${$#}
eval $#=
cmd="xmlstarlet sel "
for arg in $@
do
if [ -n $arg ]
then
var=${arg%%\=*}
expr=${arg#*=}
cmd+=" -t -o \"$var="\" -v $expr -o \""\" -n"
fi
done
eval $cmd $file
}
$ eval $(get_values src='//img/@src' title='//img/@title' your_file.xml)
$ echo $src
http://imgs.xkcd.com/comics/barrel_cropped_(1).jpg
$ echo $title
Don't we all.
我敢肯定有一種更好的方法可以刪除shell函數的最后一個參數,但我不知道。
我接受了dacracot建議使用sed的建議,盡管我更希望他給我一些示例代碼
src=`echo $tag | sed 's/.*src=["]\(.*\)["] title=["]\(.*\)["] alt=["]\(.*\)["].*/\1/'`
title=`echo $tag | sed 's/.*src=["]\(.*\)["] title=["]\(.*\)["] alt=["]\(.*\)["].*/\2/'`
alt=`echo $tag | sed 's/.*src=["]\(.*\)["] title=["]\(.*\)["] alt=["]\(.*\)["].*/\3/'`
由於這再次冒泡,現在我的Xidel具有2個功能,這使這項任務變得微不足道:
xml上的模式匹配
將所有匹配的變量導出到外殼
這樣就變成了一行:
eval $(xidel "$tag" -e '<img src="{$src}" title="{$title}" alt="{$alt}"/>' --output-format bash)
如果xmlstarlet在標准安裝中可用,並且src-title-alt的順序不變,那么您也可以使用以下代碼:
tag='<img src="http://imgs.xkcd.com/comics/barrel_cropped_(1).jpg" title="Don'"'"'t we all." alt="Barrel - Part 1" />'
xmlstarlet sel -T -t -m "/img" -m "@*" -v '.' -n <<< "$tag"
IFS=$'\n'
array=( $(xmlstarlet sel -T -t -m "/img" -m "@*" -v '.' -n <<< "$tag") )
src="${array[0]}"
title="${array[1]}"
alt="${array[2]}"
printf "%s\n" "src: $src" "title: $title" "alt: $alt"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.