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)
附言。我知道我的正则表达式不是最灵活的,但它足以满足我的意图。
匹配整行,将感兴趣的部分放在一组中,用组中的内容替换。使用-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 解析器。