我如何打破长的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 :(得分: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