我正在尝试修改 markdown 文件。在一个文件中,有很多像这样的链接。
[string one](/stringtwo/#stringthree)
我想将它们更改为以下内容:
[string one](stringtwo.html#stringthree)
删除斜杠并添加.html
.
我尝试了以下方法:
sed -i 's/](\(\/.*\)#/](\1.html#/g' file
但它回来了[global configuration](/config/.html#globals)
。它不会删除斜杠。
我怎样才能使用bash
or来实现这一点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_flags
forsed
而不是s/needle/pin/flags
so 以避免转义文字/
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 启动的终端字符串。