Regex 如何使用sed仅打印匹配项?

Regex 如何使用sed仅打印匹配项?,regex,macos,bash,sed,terminal,Regex,Macos,Bash,Sed,Terminal,好吧,这很简单,但我想不出来 基本上我想从一个大的html文件中提取所有链接() 我尝试使用sed,但我得到了各种各样的结果,只是不是我想要的。我知道我的regexp是正确的,因为我可以替换文件中的所有链接: sed 's_<a href="[^<>]*">[^<>]*</a>_TEST_g' sed的测试 如果我在这样的东西上运行 <div><a href="http://wwww.google.com">A goog

好吧,这很简单,但我想不出来

基本上我想从一个大的
html
文件中提取所有链接(

我尝试使用
sed
,但我得到了各种各样的结果,只是不是我想要的。我知道我的regexp是正确的,因为我可以替换文件中的所有链接:

sed 's_<a href="[^<>]*">[^<>]*</a>_TEST_g'
sed的测试
如果我在这样的东西上运行

<div><a href="http://wwww.google.com">A google link</a></div>
<div><a href="http://wwww.google.com">A google link</a></div>

我明白了

测试
试验
我怎样才能摆脱一切,只打印匹配?我希望的最终结果是:

<a href="http://wwww.google.com">A google link</a>
<a href="http://wwww.google.com">A google link</a>


另外,我知道我的regexp不是最灵活的一个,但它足以满足我的意图。

假设每行只有一个超链接,下面可能会起作用

sed -e 's_.*<a href=_<a href=_' -e 's_>.*_>ed <<'EOF' -e 's_.*<a href=_<a href=_' -e 's_>.*_>_' sed-e's.*<a href=&ulta href='-e's.>*\u>ed<<'EOF'
-e's.*<a href=.<a href='-e's.>*.>匹配整行,将感兴趣的部分放入组中,替换为组的内容。使用
-n
选项抑制不匹配的行,并添加
p
修改器以打印
s
命令的结果

sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'
sed-n-e的!^*\(.*\).*$!\1.p'
请注意,如果线上有多个链接,则只打印最后一个链接。您可以在此基础上进行改进,但它超出了简单的sed使用范围。最简单的方法是使用两个步骤:首先在任意两个链接之前插入换行符,然后提取链接

sed -n -e 's!</a>!&\n!p' | sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'
sed-n-e的&\Np'| sed-n-e's!^*\(.*\).*$!\1.p'

这仍然不能处理HTML注释、
、分散在几行上的链接等。解析HTML时,

如果您不介意使用类似于sed的perl,它可以使用非常不同的输入进行复制:

perl -n -e 's+(<a href=.*?</a>)+ print $1, "\n" +eg;'
sed '/<a href\>/!d;s//\n&/;s/[^\n]*\n//;:a;$!{/>/!{N;ba}};y/\n/ /;s//&\n/;P;D' file
perl-n-e的+(这可能适合您(GNU-sed):

sed'/!d;s//\n&/;s/[^\n]*\n/;:a;$!{/>/!{n;ba}};y/\n/;s/&\n/;P;d'文件

sed
是一项要求吗?(
grep-o
)?谢谢,这也行。我仍然想知道sed是否可行。不幸的是,情况并非如此:(
sed '/<a href\>/!d;s//\n&/;s/[^\n]*\n//;:a;$!{/>/!{N;ba}};y/\n/ /;s//&\n/;P;D' file