如何仅获取链接的 http 源中的链接部分?
我有
<a href="http://unix.stackexchange.com/users/20661/">Unix & Linux
并想得到只是
http://unix.stackexchange.com/users/20661/
我试过
sed 's/^.*(http.*)".*$/\1/g'
但这给出了一个错误:
sed: -e expression #1, char 22: invalid reference \1 on `s' command's RHS
答案1
尝试这个:
sed -r 's/.*(http[^"]*)".*/\1/g'
在 Mac OSX 上,尝试:
sed -E 's/.*(http[^"]*)".*/\1/g'
笔记
sed
该命令有几点需要注意:
sed 's/^.*(http.*)".*$/\1/g'
这
^
是不必要的。 sed 的正则表达式总是贪婪的。这意味着,如果一个以.*
匹配开头的正则表达式,它将始终从行的开头匹配。要使其
(
成为分组字符,可以对其进行转义,也可以使用标志打开扩展正则表达式-r
(-E
在 OSX 上)。该标志通常会大大减少您需要的转义次数。另外,因为正则表达式是贪婪的,所以
(http.*)"
将匹配该行的最后一个双引号,而不是第一个。但是,URL 将以第一个双引号结尾。相反, use(http[^"]*)"
和 match 永远不会超出第一个"
。美元登录
.*$
也是多余的。同样,因为正则表达式是贪婪的,所以如果以匹配结尾的正则表达式.*
,它将匹配到行尾。
答案2
只是缺少逃避:
sed 's/^.*\(http.*\)".*$/\1/g'
(我永远记不起哪些人期待()
,哪些人期待\(\)
。)
答案3
使用awk
:
echo '<a href="http://unix.stackexchange.com/users/20661/">Unix & Linux' \
| awk -F\" '{print $2}'
http://unix.stackexchange.com/users/20661/