-2

我有以下输出

<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 脚本获取标签内的名称。

我怎样才能做到这一点?

4

2 回答 2

1

如果你的 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 之类的东西是一个更好的主意。

于 2012-08-07T16:11:57.440 回答
1

您应该查看用于解析和修改 XML 的XMLStarlet命令行工具包。

对于上述内容,您可以指定一个 XPath 来提取文本,尊重字符编码、实体等。

$ xmlstarlet sel -t -v "//name" x.xml    

将为您提供计算机名称列表(假设您的 XML 在 中x.xml)。您可以更好地格式化它们:

$ xmlstarlet sel -t -m  "//name" -v "translate(.,'&#10;','')" -n x.xml
于 2012-08-07T15:33:25.533 回答