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

rub*_*o77 6 sed regular-expression

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

我有

<a href="http://unix.stackexchange.com/users/20661/">Unix &amp; Linux
Run Code Online (Sandbox Code Playgroud)

并且想要得到

http://unix.stackexchange.com/users/20661/
Run Code Online (Sandbox Code Playgroud)

我试过

sed 's/^.*(http.*)".*$/\1/g'
Run Code Online (Sandbox Code Playgroud)

但这给出了一个错误:

sed: -e expression #1, char 22: invalid reference \1 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 9

尝试这个:

sed -r 's/.*(http[^"]*)".*/\1/g'
Run Code Online (Sandbox Code Playgroud)

在 Mac OSX 上,尝试:

sed -E 's/.*(http[^"]*)".*/\1/g'
Run Code Online (Sandbox Code Playgroud)

笔记

这个sed命令有几个需要注意的地方:

sed 's/^.*(http.*)".*$/\1/g'
Run Code Online (Sandbox Code Playgroud)
  1. ^是不必要的。sed 的正则表达式总是贪婪的。这意味着,如果一个以.*匹配开头的正则表达式,它将始终从行的开头匹配。

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

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

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