在第一次出现两个字符串之间获取文本[Shell]

时间:2012-04-11 20:17:27

标签: macos bash shell

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

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

谢谢!

4 个答案:

答案 0 :(得分: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#"

可能会有效。

答案 1 :(得分:1)

这可能对您有用:

 sed '/<url>/,/<\/url>/{//d;s/ *//;q};d' file.xml

答案 2 :(得分: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>"

答案 3 :(得分: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>

然后您可以从url获取feed.xml的值,如下所示:

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

额外的echo就是在输出结束后为你提供换行符,以使其对交互式shell友好。如果您要将结果分配给带有$()的shell变量,请将其删除。