0

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

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/到替换脚本中(这是我目前的做法)。

有没有一种聪明的方法可以做到这一点,awk或者这sed是一个坏主意,因为降价的边缘情况比预期的要多?

我在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 字符串,我想我会先在这里发布,然后再重新-如果有更简单的方法可以做到这一点,那就发明轮子。

TIA 寻求帮助。

4

1 回答 1

1

此命令将在不就地更改原始文件的情况下执行此操作:

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

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

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

该命令的工作方式如下:

  • 我使用_作为模式分隔符而不是更常见的/,因为这意味着我不必转义/路径名中的每个。
  • 此模式^!\[.*\](与您要添加路径的位置相匹配。
  • 我把上面的模式放在 the\(和 the之间\),以便以后记住。
  • 它被添加回来\1,后跟路径。

一种更简单的方法是简单地将](行的一部分 替换为])your_url_here

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

但有可能在文件的其他行中找到该组合,因此我](选择了更强的测试^!\[.*\](,它只匹配以.![](

于 2021-05-17T12:37:31.807 回答