使用shell进行XML抓取

使用shell进行XML抓取,xml,bash,parsing,shell,Xml,Bash,Parsing,Shell,我有以下输出 <computers><size>5</size><computer><id>1</id><name>NSK1210050726M</name></computer><computer><id>2</id><name>nsk1200015739m</name></computer><computer

我有以下输出

<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>
51NSK1210050726M2NSK11200015739M3SFO1502083053M5NSK1501817326M8NSK1501901173M
我希望使用shell脚本只获取标记内部的名称

如何实现这一点?

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

对于以上内容,您可以指定一个XPath来提取文本,这与字符编码、实体等有关

$ xmlstarlet sel -t -v "//name" x.xml    
将为您提供计算机名称列表(假设您的XML位于
x.XML
)。您可以更好地格式化它们,因此:

$ xmlstarlet sel -t -m  "//name" -v "translate(.,'&#10;','')" -n x.xml

如果您的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
XML='51NSK1210050726M2NSK100015739M3SFO1502083053M5NSK1501817326M8NSK1501901173M'
匹配=0
对于${XML/[]/}中的word;做
如果[$match-等式1];然后
echo$word
匹配=0
elif[$word=“name”];然后
匹配=1
fi
完成

但是真的,真的,使用@Brian Agnew建议的xml starlet之类的东西是一个更好的主意。

我尝试过使用sed,但它输出了包括标记在内的整个列表。您应该发布您尝试过的代码-n'//p'CurlOutPut.txt | sed's/*()(*)(\/).*/\1/'您知道如何使用脚本完成此任务吗?@user1582375大多数Linux和Unix发行版都配有命令行XPath工具。我认为您应该寻找其中一个。严格地说,如果可能的话,我希望使用BASH脚本来实现这一点。您可能希望使用BASH脚本,但必须委托给其他实用程序。e、 g.在上述问题中,您授权给sed。请注意,sed不支持XML,因此它可能会工作,但从长远来看,它不是一个好的解决方案。您推荐什么作为最佳解决方案?我只需要从上面的xml文件中获取名称,这样我就可以对这些名称运行额外的查询。请参见上文以获得更全面的解决方案。有人知道我如何仅使用bash脚本命令来完成此请求吗?神奇的是参数扩展-
${xml/[]/}
-它本质上是一个穷人的sed,在这种情况下,将
替换为空格。然后它只是在剩下的标记、关闭标记和cdata上使用for循环进行迭代。对xml的任何细微更改都会破坏这一点。