修改markdown链接中的URL

修改markdown链接中的URL

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

[string one](/stringtwo/#stringthree)

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

[string one](stringtwo.html#stringthree)

删除斜杠并添加.html.

我尝试了以下方法:

sed -i 's/](\(\/.*\)#/](\1.html#/g' file

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

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

答案1

这似乎可以解决问题:

$ 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)

分解它:

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

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

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

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

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

答案2

\1匹配的组's/](\(\/.*\)#/](\1.html#/g'确实包含斜杠。您应该指定\/组外\(\/.*\)。尝试这个:

sed -i 's/](\/\(.*\)\/#/](\1.html#/g' file 

答案3

使用(以前称为 Perl_6)

~$ raku -pe 's{ \( ~ \) [(\/) ( .+? ) (\/) (\# .+ )] $ } = "($1.html$3)";'  725364.in

#OR(更正式)

~$ raku -pe 's{ \( ~ \) [(\/) ( <-[#]>+? ) (\/) (\# <-[#]>+ )] $ } = "($1.html$3)";'  725364.in

输入示例(感谢@DopeGhoti):

[string one](/stringtwo/#stringthree)
[example label](/path/to/doc/#anchor)

示例输出:

[string one](stringtwo.html#stringthree)
[example label](path/to/doc.html#anchor)

因为 OP 想要更改/正斜杠,所以s///使用了与常规 Raku 替换语法不同的语法。 Raku 还提供了s{ … } = " … "上面使用的替换语法(或s[ … ] = " … "等)。

在第一个原子中,~使用了 Raku 的嵌套数据结构波浪线语法。基本上正则表达式\( ~ \) [ … ]“方括号中的组被括号包围”。然后正则表达式继续捕获/正斜杠 into $0、非贪婪字符序列 into $1、第二个/正斜杠 into ,以及由octothorpe into$2启动的终端贪婪字符序列。#$3

显示捕获(将-pe标志更改为-ne并添加say):

~$ perl6 -ne 'say s{ \( ~ \) [(\/) ( .+? ) (\/) (\# .+ )] $ } = "($1.html$3)";'  725364.in
「(/stringtwo/#stringthree)」
 0 => 「/」
 1 => 「stringtwo」
 2 => 「/」
 3 => 「#stringthree」
「(/path/to/doc/#anchor)」
 0 => 「/」
 1 => 「path/to/doc」
 2 => 「/」
 3 => 「#anchor」

在替换中,未捕获的括号被恢复。捕获的/正斜杠将被丢弃。输出捕获的路径$1,然后.html$3捕获的#octothorpe 启动的终端字符串。

https://docs.raku.org/language/regexes
https://raku.org

相关内容