1

我将如何打破长 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。谢谢你。

4

3 回答 3

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"
于 2013-02-05T00:25:56.480 回答
1

您可以在 shell 级别而不是 sed 级别上破坏它:

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

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

于 2013-02-05T00:49:35.420 回答
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
于 2013-02-04T23:22:54.483 回答