2014-10-27 100 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