【发布时间】:2020-06-12 17:14:27
【问题描述】:
我有一些相关链接损坏的降价文件。我希望修复它们。 例如,我有这个(非常短的)示例文件:
Please refer to [this first ressource](wrong/path/to/file) and [this other ressource](non/existing/text).
You can also search on [this website](https://example.net).
请注意,同一行可以有多个链接,还有外部链接,应该保持不变。
在第一种方法中,如果我们忘记了外部链接,并且如果相关链接指向的正确资源仅放在子文件夹中,我们可以采用这种方法:
sed -i -E "s/(\[.*\])\(([^\)]*)\)/\1(subfolder\/\2)/g" document.md
这会将我的示例文档变成这样:
Please refer to [this first ressource](subfolder/wrong/path/to/file) and [this other ressource](subfolder/non/existing/text).
You can also search on [this website](subfolder/https://example.net).
但是我们这里有两个问题:
- 外部链接乱了
- 链接指向的正确资源不只是在某些子文件夹中。虽然可以从错误的路径中确定正确的路径,但我们必须遍历整个文件夹才能做到这一点。例如,这可以在 bash 脚本中轻松完成。
所以我需要一种方法在 sed 确定替换字符串之前将函数应用到我的捕获组。在这里,我需要处理的捕获标志是\2。
即使没有 sed,任何解决方案都是可以接受的。
谢谢。
【问题讨论】:
-
我对 sed 了解不多,但您可以使用
\(((?!http).*?)\)regex101.com/r/NmPozZ/1 定位非完整路径 URL -
@MonkeyZeus Sed 没有环视。
-
@BenjaminW。 OP 提到“任何解决方案,即使没有 sed 也是可以接受的。”所以听起来他们可能可以使用支持 PCRE2 的语言
-
@MonkeyZeus 当然——但请注意,您的正则表达式也会修改恰好在括号中的普通文本。
-
@BenjaminW。如果这样的文字有问题,那么您可以确保您正在查看 Markdown 链接:
(\[[^\[]+\]\()((?!http)[^)]+)\)regex101.com/r/fR8fRF/1