使用 sed 删除除特定模式之外的所有模式

使用 sed 删除除特定模式之外的所有模式

如何仅获取链接的 http 源中的链接部分?

我有

<a href="http://unix.stackexchange.com/users/20661/">Unix &amp; 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'
  1. ^是不必要的。 sed 的正则表达式总是贪婪的。这意味着,如果一个以.*匹配开头的正则表达式,它将始终从行的开头匹配。

  2. 要使其(成为分组字符,可以对其进行转义,也可以使用标志打开扩展正则表达式-r-E在 OSX 上)。该标志通常会大大减少您需要的转义次数。

  3. 另外,因为正则表达式是贪婪的,所以(http.*)"将匹配该行的最后一个双引号,而不是第一个。但是,URL 将以第一个双引号结尾。相反, use(http[^"]*)"和 match 永远不会超出第一个"

  4. 美元登录.*$也是多余的。同样,因为正则表达式是贪婪的,所以如果以匹配结尾的正则表达式.*,它将匹配到行尾。

答案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/

相关内容