我想写一个脚本:
- 接受一些 RSS-Feed URL 作为输入
- 下载提要
- 删除标记不匹配某些正则表达式
<item> ...</item>
的所有匹配项。title
下面的例子应该说明这一点。假设我们有一个包含这三个项目的 RSS 提要:
- Project Foo - 让我们开始吧!
- 完全不同的东西
- Project Foo 的另一个更新
我只想保留标题中包含“Project Foo”的那些项目。
示例输入文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>My glorious newsfeed</title>
<description>...</description>
<link>...</link>
<language>...</language>
<pubDate>...</pubDate>
<item>
<title>Project Foo - Let's get started!</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Something else entirely</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Another update on Project Foo</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
</channel>
</rss>
示例输出文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>My glorious newsfeed</title>
<description>...</description>
<link>...</link>
<language>...</language>
<pubDate>...</pubDate>
<item>
<title>Project Foo - Let's get started!</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Another update on Project Foo</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
</channel>
</rss>
如果可能的话,我想远离类似的东西,python
并使用命令行工具来做到这一点。但我是一个使用sed
等的大新手,需要一些帮助:)
这是我到目前为止所拥有的:
cat sample-feed.xml \
| tr -d '\n' \
| sed $'s/\<item\>/\\\n\<item\>/g;s/\<\/channel\><\/rss\>/\\\n\<\/channel\><\/rss\>/g' \
| sed '/^\<item\>/ d'
首先,我删除所有换行符。然后,我添加换行符以将每个换行符带到<item>...</item>
自己的行中。到目前为止的最后一个命令删除所有以 . 开头的行<item>
。为了
结果是一个没有任何项目的有效 rss-feed:
<?xml version="1.0" encoding="iso-8859-1"?><rss version="2.0"><channel><title>My glorious newsfeed</title><description>...</description><link>...</link><language>...</language><pubDate>...</pubDate>
</channel></rss>
为了使用 URL 而不是本地文件,我只需将其替换cat sample-feed.xml
为curl -s <some url>
.
但是仍然缺少的是对命令的修改sed '/^\<item\>/ d'
,它只删除以“Project Foo”开头<item>
但不包含“Project Foo”的行。
所以,如果你能帮我弄清楚最后一行应该说什么,我会很高兴。另一方面,我确信有一种更优雅的方法可以做到这一点。从我所见sed
,它非常强大,应该可以在一个sed
命令中执行此操作。
期待你的回答:-)