我将如何打破长 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。谢谢你。
我已经找到了一个具有多个变量的解决方法。它并不完美,但它有效。这是以防万一其他人遇到类似问题。如果有人找到更好的解决方案,请在这里分享。
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"
您可以在 shell 级别而不是 sed 级别上破坏它:
sed -n 's/.*<a href="\(.*\)" target="_blank" '\
'rel="nofollow">Download<\/a>.*/\1/p'
不幸的是,这不允许缩进第二行。
您实际上想要提取字符串(url),而不是替换。删除 sed 并使用 grep 怎么样?会很短!
grep -Po '(?<=href=")[^"]*' file
例子:
kent$ echo 'foo<a href="IWantIt" target="_blank" rel="nofollow">Download</a>baz'|grep -Po '(?<=href=")[^"]*'
IWantIt