【问题标题】:Treat capture groups with custom function before using them in the replace part在替换部分中使用捕获组之前,使用自定义函数处理它们
【发布时间】: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

标签: regex sed markdown


【解决方案1】:

关于第二个要点,

链接指向的正确资源不只是在某些子文件夹中。虽然可以从错误的路径中确定正确的路径,但我们必须遍历整个文件夹才能做到这一点。例如,这可以很容易地在 bash 脚本中完成。

你没有提到这个bash 脚本应该做什么。在下面我假设你已经定义了一个 correct_path 函数来完成这项工作:

correct_path () { echo ${1//@(wrong|non\/existing)/correct}; } # this example assumes shopt -s extglob

定义该函数后,您可以运行以下命令,该命令

  • 执行sed 命令将每个address 更改为$(correct_path address) 并将结果用双引号括起来以保留换行符"$(…)"
  • evals 由echo"、上面生成的"$(…)" 和另一个" 组成。
eval echo '"'"$(< os sed -E 's/(\[[^]]*\])\(([^)]*)\)/\1($(correct_path \2))/g')"'"' > os

但是eval is evil.

【讨论】:

    猜你喜欢
    • 2021-07-08
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2014-04-15
    • 2016-11-14
    • 2012-02-24
    • 2018-05-30
    相关资源
    最近更新 更多