使用 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
命令进行下载。
到目前为止,我已经使用了 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
如何解决这个问题?
P.S。我也试过 lynx -dump -image_links -listonly $path
但这会打印整个文件。
我也愿意接受其他解决此目的的选项,只要我可以将代码连接到我当前的 shell 脚本中。
您可以在括号的否定表达式中添加方括号:
grep -Eo "https?://[^][ ]+\.(jpg|png|gif)"
参见online demo。 详情:
https?://
- http://
或 https://
[^][ ]+
- ]
、[
和 space 以外的一个或多个字符
\.
- 一个点
(jpg|png|gif)
- 三个备选子字符串中的任何一个。
我有一些降价文件要处理,其中包含指向我希望下载的图像的链接。例如降价文件:
[![](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
如何解决这个问题?
P.S。我也试过 lynx -dump -image_links -listonly $path
但这会打印整个文件。
我也愿意接受其他解决此目的的选项,只要我可以将代码连接到我当前的 shell 脚本中。
您可以在括号的否定表达式中添加方括号:
grep -Eo "https?://[^][ ]+\.(jpg|png|gif)"
参见online demo。 详情:
https?://
-http://
或https://
[^][ ]+
-]
、[
和 space 以外的一个或多个字符
\.
- 一个点(jpg|png|gif)
- 三个备选子字符串中的任何一个。