我有一些markdown文件要处理,其中包含我希望下载的图像链接。例如:
[![](https://imgs.xkcd.com/comics/git.png)](https://imgs.xkcd.com/comics/git.png)
a lot of text
some more text...
[![](https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s320/take_a_break_git.gif)](https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s1600/take_a_break_git.gif)
some more text
another URL but not image
[https://github.com]
so on
我正在尝试解析这个文件并提取图像url列表,我可以稍后通过wget
命令下载。
到目前为止,我已经使用了grep
和sed
,并得到了结果:
$ sed -nE "/https?://[^ ]+.(jpg|png|gif)/p" $path
[![](https://imgs.xkcd.com/comics/git.png)](https://imgs.xkcd.com/comics/git.png)
[![](https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s320/take_a_break_git.gif)](https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s1600/take_a_break_git.gif)
$ grep -Eo "https?://[^ ]+.(jpg|png|gif)" $path
https://imgs.xkcd.com/comics/git.png)](https://imgs.xkcd.com/comics/git.png
https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s320/take_a_break_git.gif)](https://1.bp.blogspot.com/-Ze2SiBflkZ4/XbtF1TjELcI/AAAAAAAALL4/IDC6W-b5moU0eGu2eN60aZ4pxfXW1ybmQCLcBGAsYHQ/s1600/take_a_break_git.gif
正则表达式基本上工作得很好,但问题是,由于相同的URL在同一行中出现两次,所选文本为https
的第一个出现和jpg|png|gif
的最后一个出现。但是我想要第一次出现的https
和jpg|png|gif
如何解决这个问题?
注:我也试过lynx -dump -image_links -listonly $path
,但这打印了整个文件。
我也对解决这个问题的其他选项持开放态度,只要我能把代码挂在我当前的shell脚本中。
您可以在反括号表达式中添加方括号:
grep -Eo "https?://[^][ ]+.(jpg|png|gif)"
参见在线演示。细节:
https?://
-http://
或https://
[^][ ]+
-除]
,[
和空格以外的一个或多个字符.
- a点(jpg|png|gif)
-三个备选子字符串之一。