使用sed/grep从标记文件中提取图像URI,其中包含一行中的重复项



我有一些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命令下载。

到目前为止,我已经使用了grepsed,并得到了结果:

$ 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的最后一个出现。但是我想要第一次出现的httpsjpg|png|gif

如何解决这个问题?

注:我也试过lynx -dump -image_links -listonly $path,但这打印了整个文件。

我也对解决这个问题的其他选项持开放态度,只要我能把代码挂在我当前的shell脚本中。

您可以在反括号表达式中添加方括号:

grep -Eo "https?://[^][ ]+.(jpg|png|gif)"

参见在线演示。细节:

  • https?://-http://https://
  • [^][ ]+-除],[和空格以外的一个或多个字符
  • .- a点
  • (jpg|png|gif)-三个备选子字符串之一。

最新更新