使用sed对URL进行复杂更改

时间:2014-02-22 21:25:30

标签: regex url sed

我正在尝试在Linux命令行上解析RSS提要,这涉及使用sed格式化feed的原始输出。

我目前使用此命令:

feedstail -u http://www.heise.de/newsticker/heise-atom.xml -r -i 60 -f "{published}> {title} {link}" | sed 's/^\(.\{3\}\)\(.\{13\}\)\(.\{6\}\)\(.\{3\}\)\(.*\)/\1\3\5/'

这给了我每行的一些Feed项,如下所示:

Sat 20:33 GMT> WhatsApp-Ausfall: Server-Probleme blockieren Messaging-Dienst http://www.heise.de/newsticker/meldung/WhatsApp-Ausfall-Server-Probleme-blockieren-Messaging-Dienst-2121664.html/from/atom10?wt_mc=rss.ho.beitrag.atom

注意最后的长网址。我想缩短它以更好地适应命令行。因此,我想更改我的sed命令以生成以下内容:

Sat 20:33 GMT> WhatsApp-Ausfall: Server-Probleme blockieren Messaging-Dienst http://www.heise.de/-2121664

这意味着除了破折号和“.html / blablabla”位之前的七位数字之外,从URL中删除所有内容。

目前我的sed命令只更改日期位中的内容。它必须单独留下标题和开头或URL,然后从中删除它直到达到七位数字。它需要保留它,然后在它之后切断所有东西。哦,是的,我们也需要在这个数字前留下一个短划线。

我不知道怎么做,经过数小时的谷歌搜索后找不到答案。帮助

修改

这是feedstail -u http://www.heise.de/newsticker/heise-atom.xml -r -i 60 -f "{published}> {title} {link}"行的原始输出,如果它有帮助:

Sat, 22 Feb 2014 20:33:00 GMT> WhatsApp-Ausfall: Server-Probleme blockieren Messaging-Dienst http://www.heise.de/newsticker/meldung/WhatsApp-Ausfall-Server-Probleme-blockieren-Messaging-Dienst-2121664.html/from/atom10?wt_mc=rss.ho.beitrag.atom

编辑2:

似乎我只能将输出输出到一个命令中。通过多个管道进行管道似乎打破了局面。我不明白为什么要ATM。

4 个答案:

答案 0 :(得分:2)

不幸的是(对我而言),我只能想到用扩展 regexp语法(在不同系统上使用-E或-r标志)来解决这个问题:

... | sed -E 's|(://[^/]+/).*(-[0-9]+)\.html/.*|\1\2|'

UPDATE:在基本的正则表达式语法中,我能做的最好的就是

... | sed 's|\(://[^/]*/\).*\(-[0-9][0-9]*\)\.html/.*|\1\2|'

答案 1 :(得分:1)

编写这种正则表达式的关键是非常小心你所期望的界限是什么,以避免你想要摆脱的随机垃圾导致你问题。此外,您应该记住,您可以使用/以外的字符作为s操作分隔符的一部分。

sed 's!\(http://www\.heise\.de/\)newsticker/meldung/[^./]*\(-[0-9]+\)\.html[^ ]*!\1\2!'

请注意,正确获取RE可能非常棘手;假设你需要测试它! (这是“现在你有两个问题”引用的关键部分; RE很容易变得可怕。)

答案 2 :(得分:1)

这样的事可能吗?

... | awk -F'[^0-9]*' '{print "http://www.heise.de/-"$2}'

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's|\(//[^/]*/\).*\(-[0-9]\{7\}\).*|\1\2|' file

您可以放置​​第一个sed命令:

feedstail -u http://www.heise.de/newsticker/heise-atom.xml -r -i 60 -f "{published}> {title} {link}" |
sed 's/^\(.\{3\}\)\(.\{13\}\)\(.\{6\}\)\(.\{3\}\)\(.*\)/\1\3\5/;s|\(//[^/]*/\).*\(-[0-9]\{7\}\).*|\1\2|'