修改markdown链接中的URL

shi*_*hin 2 bash sed text-processing markdown

我正在尝试修改 markdown 文件。在一个文件中,有很多像这样的链接。

[string one](/stringtwo/#stringthree)
Run Code Online (Sandbox Code Playgroud)

我想将它们更改为以下内容:

[string one](stringtwo.html#stringthree)
Run Code Online (Sandbox Code Playgroud)

删除斜杠并添加.html.

我尝试了以下方法:

sed -i 's/](\(\/.*\)#/](\1.html#/g' file
Run Code Online (Sandbox Code Playgroud)

但它回来了[global configuration](/config/.html#globals)。它不会删除斜杠。

我怎样才能使用bashor来实现这一点sed

Dop*_*oti 5

这似乎可以解决问题:

$ cat 725364.in
[string one](/stringtwo/#stringthree)
[example label](/path/to/doc/#anchor)
$  sed 's_\(\[[^]]*]\)(/\([^#]*\)/\(#[^)]*\))_\1(\2.html\3)_g' 725364.in
[string one](stringtwo.html#stringthree)
[example label](path/to/doc.html#anchor)
Run Code Online (Sandbox Code Playgroud)

分解它:

首先,我使用s_needle_pin_flagsforsed而不是s/needle/pin/flagsso 以避免转义文字/s。

sed将使用此表达式进行搜索\(\[[^]]*]\)(/\([^#]*\)/\(#[^)]*\)),细分为:

  • \(\[[^]]*]\)- 第 1 组的定义(链接标签):
    • 字面意思[
    • 后跟零个或多个或任何非]
    • 后面跟着一个字面意思]
  • (/- 字面意义(/
  • \([^#]*\)- 第 2 组(URL)的定义:
    • 零个或多个非字面值的内容#
  • /- 字面意义/
  • \(#[^)]*\)- 第 3 组(锚)的定义:
    • 字面意思#
    • 后跟零个或多个非文字的内容)
  • )- 字面意义)

并使用 对其进行转换\1(\2.html\3),分解为:

  • 第 1 组的比赛,随后
  • (, 其次是
  • 第 2 组的比赛,随后
  • .html, 其次是
  • 第 3 组的比赛,随后是
  • )