2013-02-04 33 views
1

我怎麼會打破一個長sed的線路,例如:破龍SED字符串

sed -n 's/.*<a href="\(.*\)" target="_blank" rel="nofollow">Download<\/a>.*/\1/p' 

我想有這樣的事情,例如:

sed -n 's/.*<a href="\(.*\)" target="_blank" 
    rel="nofollow">Download<\/a>.*/\1/p' 

我知道「\」但它不適用於sed。謝謝。

+0

爲什麼?大多數人的終端可以在這幾天做大於80個字符... – John3136

+0

是的,但我喜歡將我的腳本保持在80以下,這使得使用80x24終端和nano時更容易=)感謝您的評論。 – Tux

回答

0

你實際上想提取字符串(url),而不是取代。如何刪除sed並採取grep?它會很短!

grep -Po '(?<=href=")[^"]*' file 

例如:

kent$ echo 'foo<a href="IWantIt" target="_blank" rel="nofollow">Download</a>baz'|grep -Po '(?<=href=")[^"]*' 
IWantIt 
+0

那些只是例子=)我需要知道如何拆分內部sed。所以你的例子與我的問題無關,但謝謝。 – Tux

+0

@Tux我沒有在你的sed行中看到「split」。只是看到你把你的產品線「分解」成兩個。順便說一句,你的問題被標記爲'bash',我認爲grep也參與其中。但很抱歉令人不安。 – Kent

+0

沒問題謝謝你的評論。我已修復該帖子。 – Tux

1

我已經想通了多變量解決方法。它不完美,但它的作品。在這種情況下,任何其他人都有類似的問題。如果有人找到更好的解決方案,請在此分享。

str1='<a href="\(.*\)" target="_blank"' 
str2='rel="nofollow">Download<\/a>' 
sed -n "s/.*$str1 $str2.*/\1/p" 

另一種方法是使用heredoc,這是一種更清潔的方式。

str=$(cat <<'EOF' 
<a href="\(.*\)" target="_blank" \ 
rel="nofollow">Download<\/a> 
EOF 
) 

sed -n "s/.*$str.*/\1/p" 

好吧,我也發現,printf的,可以使用類似這樣的,但你一定要逃逸雙引號。

str=$(printf "<a href=\"\(.*\)\" target=\"_blank\" \ 
rel=\"nofollow\">Download<\/a>") 

sed -n "s/.*$str.*/\1/p" 

最乾淨的方法是這樣的。

str="<a href=\"\(.*\)\" target=\"_blank\" \ 
rel=\"nofollow\">Download<\/a>" 

sed -n "s/.*$str.*/\1/p" 
1

你可以打破它在外殼上水平,而不是sed的水平:

sed -n 's/.*<a href="\(.*\)" target="_blank" '\ 
'rel="nofollow">Download<\/a>.*/\1/p' 

不幸的是,不允許縮進第二行。

+0

是的,這也適用。另外,如果在鏈接中需要target和rel變量之間的空格,則可以執行target =「_ blank」'\請注意雙引號和單引號之間的空格。我之前已經嘗試過這種方法,但是在rel變量之前沒有使用ofc的縮進。謝謝你指出。 – Tux