将 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/
硬编码到替换脚本中(我目前就是这样做的)。
有没有一种聪明的方法可以用 awk
或 sed
做到这一点,或者这是一个坏主意,因为 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
但 ](
组合可能会在其他行中找到
你的文件,所以我选择了更强的测试 ^!\[.*\](
只匹配
以 ![
开头并在 ](
.
之前有一些内容的行
我有一堆混合了相对和绝对图像目标的降价文档。例如
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
做到这一点,或者这是一个坏主意,因为 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
但
之前有一些内容的行](
组合可能会在其他行中找到 你的文件,所以我选择了更强的测试^!\[.*\](
只匹配 以![
开头并在](
.