0

我有一个看起来像这样的 feed.xml 文件。我想要做的是从这个提要中获取 test.html。(基本上,最上面的项目的 url。)关于如何做到这一点的任何想法?

<rss>
<item>
    <title>ABC</title>
    <url>
        test.html
    </url>
</item>
<item>
    <title>CDE</title>
    <url>
        test1.html
    </url>
</item>
</rss>

谢谢!

4

4 回答 4

1

如果结构是固定的并且您知道 URL 具有后缀 .html,您可以简单地执行以下操作:

  cat <yourfile> | grep ".html" | head -n1

如果你不知道后缀(或者字符串“html”之前可以存在),你可以这样做:

 cat <yourfile> | grep -A1 "<url>" | head -n2 | tail -n1

编辑 如果结构不固定(即没有换行符),那么这个

 cat <yourfile> | grep -o "<url>[^<]*</url>" | head -n1 | cut -d'>' -f2 | cut -d'<' -f1

或者那个

 cat <yourfile> | grep -o "<url>[^<]*</url>" | head -n1 | sed -E -e"s#<url>(.*)</url>#\1#"

可能工作。

于 2012-04-11T20:29:13.190 回答
1

这可能对您有用:

 sed '/<url>/,/<\/url>/{//d;s/ *//;q};d' file.xml
于 2012-04-11T21:11:20.957 回答
0

这个 awk 脚本应该可以工作:

awk '/<url>/ && url==0 {url=1;next;} {if(url==1) {print;url=2;}}' file

编辑:

以下 grep 命令也可能有效:

grep -m 1 "^ *<url>" -A1 file | grep -v "<url>"
于 2012-04-11T20:27:58.230 回答
0

我建议不要使用基于行的工具,而是使用 xsl 转换从文档中获取您想要的数据,而无需对其格式进行假设。

如果将其保存到get-url.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xsl:output method="text"/>
        <xsl:template match="/">
                    <xsl:value-of select="normalize-space(rss/item/url)"/>
        </xsl:template>
</xsl:stylesheet>

然后你可以像这样得到urlfrom的值feed.xml

$ xsltproc get-url.xsl feed.xml; echo
test.html
$

额外echo的只是在输出结束后给你一个换行符,使其对交互式 shell 友好。如果您将结果分配给带有$().

于 2012-04-11T20:50:04.380 回答