如何grep博客中的URL?

hen*_*dry 2 grep

我正在编写一个脚本来从我的博客帖子中获取URL并运行curl -I它们以便我可以检查它们是否仍然很好.但是我在编写grep模式时遇到了麻烦.

<p><a href="http://example.com/fujipol/2004/may/5/16:10:47/400x345">foobar</a></p>
Run Code Online (Sandbox Code Playgroud)

所以我想在这里http://example.com/fujipol/2004/may/5/16:10:47/400x345.

或者在降价时:

[Example markdown link](https://example.com)
Run Code Online (Sandbox Code Playgroud)

https://example.com

<http://example.com/?foo=bar>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要 http://example.com/?foo=bar

ДМИ*_*КОВ 6

使用示例中的链接创建文件:

$> cat ./text
<p><a href="http://example.com/fujipol/2004/may/5/16:10:47/400x345">foobar</a></p>
[Example markdown link](https://example.com)
<http://example.com/?foo=bar>
<a href="http://people.debian.org/~dilinger/backports/wordpress">http://people.debian.org/~dilinger/backports/wordpress</a>
Run Code Online (Sandbox Code Playgroud)

用一些正则表达式"greped"它并从中获取所有URL:

$> grep --only-matching --perl-regexp "http(s?):\/\/[^ \"\(\)\<\>]*" ./text
http://example.com/fujipol/2004/may/5/16:10:47/400x345
https://example.com
http://example.com/?foo=bar
http://people.debian.org/~dilinger/backports/wordpress
http://people.debian.org/~dilinger/backports/wordpress
Run Code Online (Sandbox Code Playgroud)

完成.

http(s?):\/\/[^ \"\(\)\<\>]*
Run Code Online (Sandbox Code Playgroud)

我们在这里做的是匹配http(s)(url可以以http://或开头https://),而不是匹配//和转义它.最后,我们匹配的符号不等于序列 or "()<>.

最后,在这样的任务,整个问题想通了,我怎么决定部分,我们需要开始(http(s)://在这种情况下)和结束(, ",(,),<,>).

坦率地说,这个解决方案并不是很完美.一些网址标准说明了关于网址可以包含或不包含的符号的更多信息.所以,你马上就会知道,在我的回答中使用正则表达式是无效的.但是,如果你描述它的作品有卖.