2011-09-30 25 views
1

我正在尝试使用sed解析一些非常简单的rss。就像掏出机箱的网址来收听最新消息一样。 例子:sed匹配多行,但仅在某一行已被看到后

sed -n -e 's/.*"\([^"]*\.mp3\)".*/\1/p' -e 's/.*<title>\([^<]*\)<.title>.*/\1/p' 

虽然,我想这样做是为了启动这个匹配后,才在一定令牌已经看到,在这种情况下,“<项目>”,让我不明白任何饲料<标题> s,或这样的。

GNU sed的是好的,我想我能以某种方式使用双地址形式“0,/ REGEXP /”,但我不知道如何结合这一实现上述

增加对Dawnofthedead:

foo 
bar 
baz 
<title>fum</title> 
baz 
fie 
<item> 
    <title>1</title> 
    <enclosure url="one.mp3"> 
</item> 
<item> 
    <title>2</title> 
    <enclosure url="two.mp3"> 
</item> 

应该给我

1 
one.mp3 
2 
two.mp3 

回答

0

如果您需要解析的命令行简单的XML(如RSS源)你为什么不尝试xsltproc的

它需要输入一个xml,并可以应用xslt转换样式表。 你必须学习xslt语言,但你可以产生更好的输出。

+0

我宁愿学习如何搭配之间寻找/替换了一定的比赛已经取得了之后。在过去,我使用了awk和sed的组合。但我虽然sed应该足够多。这是我发现自己想要为不同类型的文件做的事情,不仅仅是xml。 – Daniel

2

如果你坚持sed,试试这一行。这条线的工作原理与给定的例子:

kent$ sed -nr '/<item>/,/<\/item>/p' yourFile|sed -nr '/<title>/{s#[ ]*<[/]?title>##g;p}; /<enclosure/{ s#.*url="(.*)">#\1#g;p}' 

测试

kent$ cat t 
foo 
bar 
baz 
<title>fum</title> 
baz 
fie 
<item> 
    <title>1</title> 
    <enclosure url="one.mp3"> 
</item> 
<item> 
    <title>2</title> 
    <enclosure url="two.mp3"> 
</item> 

kent$ sed -nr '/<item>/,/<\/item>/p' t |sed -nr '/<title>/{s#[ ]*<[/]?title>##g;p}; /<enclosure/{ s#.*url="(.*)">#\1#g;p}' 
1 
one.mp3 
2 
two.mp3 
+0

谢谢肯特,我被困在试图结合,但两个sed的罚款。 – Daniel

1
$ sed -n -f s.sed input 
1 
one.mp3 
2 
two.mp3 

其中s.sed是:

/<item>/,/<\/item>/{ 
    s/^.*>\([^<]\+\).*$/\1/ 
    s/^.*"\(.*\)".*$/\1/ 
    />$/d 
    p 
} 
0

这可能会为你工作:

sed '$!N;s/^\s*<title>\(.*\)<\/title>\n\s*<enclosure url="\([^"]*\)">/\1\n\2/p;D' file 
1 
one.mp3 
2 
two.mp3 
与SED

不是<item>...</item>的神色为两线<title>...<enclosure...