将 url 添加到降价文档中的所有相关图像链接

Prepend a url to all relative image links in a markdown document

我有一堆混合了相对和绝对图像目标的降价文档。例如

This is some text

![optional caption](/sub/folder/image.png)

And more text

![](https://example.com/cool_image.png)

我想在每个相关图像前添加 URL,例如将上面的更改为

This is some text

![optional caption](https://some-image-host/image-host-subpath/sub/folder/image.png)

And more text

![](https://example.com/cool_image.png)

但最好不要将 /sub/folder/ 硬编码到替换脚本中(我目前就是这样做的)。

有没有一种聪明的方法可以用 awksed 做到这一点,或者这是一个坏主意,因为 markdown 的边缘情况比人们预期的要多?

我在 https://pypi.org/project/marko/ 方面取得了一些进展,例如

import marko
with open("myfile.md") as f: s = f.read()

doc = marko.inline.parser.parse_inline(s)

for i, e in eumerate(doc):
    if type(e) == marko.inline.Image:
        if not e.dest.startswith("http"):
            doc[i].dest = "https://some-image-host/image-host-subpath/" + doc[i].dest

它会找到所有图像并使用 URL 更新每个相关图像的目标,但我不太确定如何将这个内联元素列表再次渲染回 markdown 字符串,我我想我会 post 在重新发明轮子之前先在这里,以防有更简单的方法来做到这一点。

TIA 寻求任何帮助。

此命令将执行此操作而不会就地更改原始文件:

sed 's_\(^!\[.*\](\)_https://some-image-host/image-host-subpath_' <input_file

一旦你确认这是你想要的,你只需要在后面添加-i sed's_... 之前,也删除 input_file 之前的 <:

sed -i 's_\(^!\[.*\](\)_https://some-image-host/image-host-subpath_' input_file

命令的工作方式如下:

  • 我使用 _ 作为模式分隔符,而不是更常见的 /, 因为这意味着我不必转义路径名中的每个 /
  • 此模式 ^!\[.*\]( 匹配您要添加路径的位置。
  • 我把上面的模式放在 \(\) 之间,以便记住它 稍后。
  • </code> 加回去,后跟路径。</li> </ul> <p> 一种更简单的方法是简单地将行的 <code>]( 部分替换为 ])your_url_here:

    sed 's_](_](https://some-image-host/image-host-subpath/_' <test
    

    ]( 组合可能会在其他行中找到 你的文件,所以我选择了更强的测试 ^!\[.*\]( 只匹配 以 ![ 开头并在 ](.

    之前有一些内容的行