打破长SED字符串

时间:2013-02-04 23:17:46

标签: bash 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。谢谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

你可以在shell级别而不是sed级别打破它:

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

不幸的是,这不允许缩进第二行。

答案 2 :(得分: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