我正在尝试编写一个bash脚本来从xml文件such as this中提取多个“控制器”,并用管道将它们分开,即Tom Tykwer | Andy Wachowski。
相关的xml部分是:
<directors>
<item>Tom Tykwer</item>
<item>Andy Wachowski</item>
</directors>
使用bash脚本中的xmlstarlet,可以使用以下命令:
DIRECTORS=$(xmlstarlet sel -t -v "imdbdocument/directors/item" mymoviexml)
echo $DIRECTORS
给我
Tom Tykwer Andy Wachowski
这个命令直接在终端
xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml
给了我:
(empty line)
Tom Tykwer
Andy Wachowski
当我没有指定-n选项时,我不知道为什么要添加新行。
我的一些搜索建议如下:
xmlstarlet sel -t -m "imdbdocument/directors" -v "item" -o "|" mymovieapi.xml
但这只是给了我:
Tom Tykwer
Andy Wachowski|
我很感激我能得到任何帮助。我在Xianuntu 13.10上的Debian Wheezy和xmlstarlet 1.5.0上看到xmlstarlet 1.3.1的这种行为。
答案 0 :(得分:2)
仅使用xmlstarlet的解决方案:
xmlstarlet sel -T -t -v '/imdbdocument/directors/item[1]' -m '/imdbdocument/directors/item[position()>1]' -o '|' -v . mymovieapi.xml
我使用1.5版进行了测试,但我相信它也适用于早期版本。
替代方案,使用--if
而不是2个XPath表达式:
xmlstarlet sel -T -t -m '/imdbdocument/directors/item' --if 'position() > 1' -o '|' -b -v . mymovieapi.xml
-b
为--break
,它结束当前语句(条件或循环),如C中的}
。
答案 1 :(得分:1)
你可以尝试
xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml | awk '1' ORS='|'
带输出
|Tom Tykwer|Andy Wachowski|
或者如果您不想要前导和尾随管道|
:
xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml | awk 'NF>0 {if (i++) printf "|"; printf "%s", $0 } END { printf "\n" }'
给出
Tom Tykwer|Andy Wachowski