如何使用 sed 只打印匹配项?

Dru*_*erB 2 regex macos bash terminal sed

好吧,这是一个简单的问题,但我无法弄清楚。

基本上我想<a href="[^<>]*">[^<>]*</a>从一个大html文件中提取所有链接()。

我尝试用 执行此操作sed,但得到了各种结果,但不是我想要的。我知道我的正则表达式是正确的,因为我可以替换文件中的所有链接:

sed 's_<a href="[^<>]*">[^<>]*</a>_TEST_g'
Run Code Online (Sandbox Code Playgroud)

如果我在类似的东西上运行它

<div><a href="http://wwww.google.com">A google link</a></div>
<div><a href="http://wwww.google.com">A google link</a></div>
Run Code Online (Sandbox Code Playgroud)

我明白了

<div>TEST</div>
<div>TEST</div>
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱其他一切并只打印匹配项?我首选的最终结果是:

<a href="http://wwww.google.com">A google link</a>
<a href="http://wwww.google.com">A google link</a>
Run Code Online (Sandbox Code Playgroud)

附言。我知道我的正则表达式不是最灵活的,但它足以满足我的意图。

Gil*_*il' 5

匹配整行,将感兴趣的部分放在一组中,用组中的内容替换。使用-n选项来抑制不匹配的行,并添加修饰符p来打印命令的结果s

sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'
Run Code Online (Sandbox Code Playgroud)

请注意,如果该行有多个链接,则仅打印最后一个链接。您可以对此进行改进,但它超出了简单的 sed 使用范围。最简单的方法是使用两个步骤:首先在任意两个链接之前插入换行符,然后提取链接。

sed -n -e 's!</a>!&\n!p' | sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'
Run Code Online (Sandbox Code Playgroud)

这仍然不能处理 HTML 注释、<pre>跨多行的链接等。解析 HTML 时,请使用 HTML 解析器