2014-10-27 96 views
1

我想在一行中的所有链接的两侧插入<>。 以下是永远对我行在链接周围添加尖括号

  • 中的链接以http://
  • 有一条线三个字
  • 空格隔开的话
  • 每行开始与两个链接然后一个字符串或数字

的行看起来是这样的:

http://website1.com/123123 http://homepage.net/3846 INDONESIA 

我曾尝试以下:

sed '[email protected]^http:[^ ][email protected]<&>@g' 

但我做错了什么:P

可有人请张贴SED声明,这是否?

+3

我看不出有什么理由不满意这个问题。 – 2014-10-27 15:34:36

+0

只需指出:检测URL是一个难以解决的问题:http://www.regexguru.com/2008/11/detecting-urls-in-a-block-of-text/ – 2014-10-27 17:26:04

+0

呵呵,那是我的第一个的方法,但我很快就放弃了。幸运的是,我的网址总是统一的,因此很容易识别。 :) – 2014-10-28 08:14:41

回答

1

我用这一个演奏家倾销:

sed -e "[email protected]\(http://\S\+\)@\<\1\>@g" -e "[email protected]\(^<[^>]*> <[^>]*> \)\([^<].*$\|<.\{0,7\}$\|<\([^h]\|h[^t]\|ht[^t]\|htt[^p]\|http[^:]\|http:[^/]\|http:/[^/]\).*$\)@\1\"\"\"\2\"\"\"@g" -e "[email protected]\([^\.]\)[ \t]*\[email protected]\1\[email protected]" 

它有点臃肿,你也许可以拿出af事实上,但它对我有用。

+0

这很有趣,因为我需要修复virtuoso SPARQL结构查询的输出。我看到你也在行尾添加了一个点,然后为文字添加引号。我不知道最后一部分是否在我的数据集中是必需的,但我会使用它。 – 2014-10-28 08:12:47

2

这个sed的一行代码在这里工作:

sed '[email protected]\bhttp://\S*@<&>@g' 

测试与您的数据:

kent$ sed '[email protected]\bhttp://\S*@<&>@g'<<<"http://website1.com/123123 http://homepage.net/3846 INDONESIA" 
<http://website1.com/123123> <http://homepage.net/3846> INDONESI 
1

你的主要错误是,你认为“HTTP”是在字符串的开头(与主播^),但并非总是如此。第二个错误是,你使用的必须在基本模式进行转义的+,但你可以使用*代替:

sed '[email protected]\(^\| \)\(http:[^ ]*\)@\1<\2>@g' 
1
sed -r 's/http:[^ ]+/<&>/g' 

测试:

$ echo "http://website1.com/123123 http://homepage.net/3846 INDONESIA" | sed -r 's/http:[^ ]+/<&>/g' 
<http://website1.com/123123> <http://homepage.net/3846> INDONESIA