Regex 更改第一个括号中的文本,然后是第三个/方括号

Regex 更改第一个括号中的文本,然后是第三个/方括号,regex,sed,Regex,Sed,我想在行尾附加一些文本(.html),格式为[some_text](some/other/text);基本上是标记语法中的链接 范例 [Test](test/link) would be [Test](test/link.html) [Test](test/link1/link) would be [Test](test/link1/link.html) [Test] would be [Test] (test) would be (test) 所以我尝试了unixsed,语法是:sed-I的

我想在行尾附加一些文本(.html),格式为
[some_text](some/other/text)
;基本上是标记语法中的链接

范例

[Test](test/link) would be [Test](test/link.html)
[Test](test/link1/link) would be [Test](test/link1/link.html)
[Test] would be [Test]
(test) would be (test)
所以我尝试了unix
sed
,语法是:
sed-I的/\[*\](*)/.html)/g'filename.md
。所说的
sed
语法错误且不起作用,有人能帮忙吗?我愿意使用其他工具,如
awk
perl
,它适合这种情况

解决方案
sed-i的/\(\[^][*]([^()]*\)/\1.html)/g'filename.md


@WiktorStribiżew根据给定样本建议:

$cat ip.txt
[测试](测试/链接)
[测试](测试/链接1/链接)
[测试]
(测试)
#如果关闭),也应该匹配:sed-E的/(\[[^]+]\([^]+)\)/\1.html)/'
$sed-E's/\[[^]+]\([^]+/&.html/'ip.txt
[Test](Test/link.html)
[Test](Test/link1/link.html)
[测试]
(测试)
  • \[
    匹配
    [
  • [^]]+
    匹配一个或多个非
    ]
    字符
  • ]\(
    匹配
    ](
  • [^]+
    匹配一个或多个非
    字符
  • &
    反向引用整个匹配部分
  • \1
    第一个捕获组匹配的反向引用部分

使用
perl

perl-pe的/\[^]+]\([^]+\K(?=\)/.html/'
  • \K
    有助于避免捕获在此之前匹配的文本
  • (?=\)
    是用于匹配
    字符的先行断言,它也不是匹配部分的一部分
在任一解决方案按预期工作后,为其添加
-i
选项。

您可以使用

sed-i的/\(\[[^][]*]([^()]*\)/\1.html)/g'filename.md

正则表达式是一个匹配

  • \(\[[^][]*]([^()]*\)
    -第1组:
    • \[
      -a
      [
      字符
    • [^][]*
      -除
      [
      ]
      之外的零个或多个字符
    • ]
      -a
      ]
      字符
    • -a
      字符
    • [^()]*
      -零个或多个字符少于
  • -a
    字符

-i
选项在GNU
sed
g
标志中作为输入文件提供的同一文件中进行替换,将查找行中的所有匹配项。

一行中可以有多个匹配项吗?可能
sed's/\(\[^][*]([^()]*\)/\1.html)/g'filename.md
?@Sundeep>每行只能有一个匹配项。