2013-04-05 50 views
0

我有一個sed命令工作正常,除非在文件的某處出現換行符。這是我的命令:SED取代'可能'換行

sed -i 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g' 

現在,它完美的作品,但我只是碰到這種文件具有a標籤,像這樣跑:

<a href="link">Click 
     here now</a> 

當然它並沒有找到這一個。所以我需要修改它以允許在搜索中換行。但我不知道如何讓它可以做到這一點,除非我首先查看整個文件,並且事先刪除所有的\n。問題是我放棄了文件中的所有格式。

回答

2

可以通過插入一個循環到sed腳本,做到這一點:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile 

原樣,這將會使輸出的嵌入式換行,如果你想這樣的說法,目前還不清楚或不。如果沒有,只是替代了換行:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile 

也許清理多餘的空格:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s/\s\{2,\}/ /g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile 

說明:/<a href/{...}讓我們忽略我們不關心行。一旦我們找到我們喜歡的一個,我們檢查它是否有結束標記。如果不是(/<\a>/!),我們抓下一行,換行符(N)和分支(b)回到:next看看我們是否找到它。一旦我們找到它,我們繼續進行替換。

+0

我不斷收到以下錯誤:'sh:1:Syntax error:Unterminated quoted string' – jfreak53 2013-04-05 22:53:35

+0

這是來自您的shell。確保你在正確的地方包含單引號。 (我把最後一個例子複製並粘貼到我的shell中,它工作正常。)順便說一句,如果你的sed版本不喜歡\ s(空格)轉義,你可以使用一個文字空間,或者[[:space: ]]在其位置。 – William 2013-04-05 23:01:09

+0

GOT IT!我想我應該提到我在我的mailcap文件中使用Mutt中的這個命令,因此我必須轉義每個''':) woops。儘管現在工作。 – jfreak53 2013-04-05 23:17:38

0

這裏是假設一個快速和骯髒溶液會有在鏈路不超過一個新行:

sed -i '' -e '/<a href=.*>/{/<\/a>/!{N;s|\n||;};}' -e 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g' 

的第一個命令(/<a href=.*>/{/<\/a>/!{N;s|\n||;};})檢查的<a href=...>存在而不</a>,在這種情況它讀入模式空間的下一行並刪除換行符。第二個是你的。