使用 sed/grep 从单行中包含重复项的降价文件中提取图像 URI

Extract image URI from markdown files using sed/grep containing duplicates in a single line

我有一些降价文件要处理,其中包含指向我希望下载的图像的链接。例如降价文件:

[![](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。但我想要第一次出现 https 和第一次出现 jpg|png|gif

如何解决这个问题?

P.S。我也试过 lynx -dump -image_links -listonly $path 但这会打印整个文件。

我也愿意接受其他解决此目的的选项,只要我可以将代码连接到我当前的 shell 脚本中。

您可以在括号的否定表达式中添加方括号:

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

参见online demo详情:

  • https?:// - http://https://
  • [^][ ]+ - ][ 和 space
  • 以外的一个或多个字符
  • \. - 一个点
  • (jpg|png|gif) - 三个备选子字符串中的任何一个。