【问题标题】:Prepend a url to all relative image links in a markdown document在 Markdown 文档中为所有相关图像链接添加 url
【发布时间】:2021-08-06 16:58:33
【问题描述】:

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

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 来做到这一点,或者这是一个坏主意,因为降价的边缘情况比预期的要多?

我在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 寻求帮助。

【问题讨论】:

    标签: python awk sed markdown marko


    【解决方案1】:

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

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

    一旦你确认这是你想要的,你只需要在后面加上-i sed's_... 之前,还删除 input_file 之前的 &lt;

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

    命令的工作方式如下:

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

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

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

    ]( 组合可能出现在其他行 你的文件,所以我选择了更强的测试^!\[.*\](,它只匹配 以![ 开头的行,在]( 之前有一些内容。

    【讨论】:

    • 也许您可能希望扩展 LHS 匹配以包含相对 url 的 /
    • 非常感谢!我认为删除^ 以识别带有![ 的图像可能是可以的(并不是我们所有的图像都在行的开头,尽管它们可能应该是)。
    • 很高兴它有帮助 - 您可以在开头添加一些选项空格 sed 's_\(^\s*!\[...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2019-03-02
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多