3

我正在尝试编写一个 bash 脚本以从诸如此类的 xml 文件中提取多个“导演”,并将它们用管道分隔,即 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|

我会很感激我能得到的任何帮助。我在 Debian Wheezy 上使用 xmlstarlet 1.3.1 和在 Xubuntu 13.10 上使用 xmlstarlet 1.5.0 看到了这种行为。

4

2 回答 2

4

仅使用 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中一样。

于 2014-01-02T21:55:05.640 回答
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
于 2014-01-01T12:21:04.410 回答