>我有以下输出
<computers><size>5</size><computer><id>1</id><name>NSK1210050726M</name></computer><computer><id>2</id><name>nsk1200015739m</name></computer><computer><id>3</id><name>SFO1502083053M</name></computer><computer><id>5</id><name>nsk1501817326m</name></computer><computer><id>8</id><name>nsk1501901173m</name></computer></computers>
我只想使用 shell 脚本获取标签内的名称。
我怎样才能做到这一点?
如果你的xml在shell变量中,比如说$XML
那么你可以使用shell参数替换和一个简单的循环来做一个非常糟糕的解析工作。
XML='<computers><size>5</size><computer><id>1</id><name>NSK1210050726M</name></computer><computer><id>2</id><name>nsk1200015739m</name></computer><computer><id>3</id><name>SFO1502083053M</name></computer><computer><id>5</id><name>nsk1501817326m</name></computer><computer><id>8</id><name>nsk1501901173m</name></computer></computers>'
match=0
for word in ${XML//[<>]/ }; do
if [ $match -eq 1 ]; then
echo $word
match=0
elif [ $word = "name" ]; then
match=1
fi
done
但实际上,使用@Brian Agnew建议的xml starlet之类的东西是一个更好的主意。
您应该查看用于解析和修改 XML 的 XMLStarlet 命令行工具包。
对于上述内容,您可以指定一个 XPath 来提取文本,尊重字符编码、实体等。
$ xmlstarlet sel -t -v "//name" x.xml
将为您提供计算机名称列表(假设您的 XML 为x.xml
)。您可以这样更好地格式化它们:
$ xmlstarlet sel -t -m "//name" -v "translate(.,' ','')" -n x.xml