使用 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>

我只想使用 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(.,'&#10;','')" -n x.xml

最新更新