我想替换所有出现的

{{i:very long text with some [special](https://google.com) nested text *here*}}

very long text with some [special](https://google.com) nested text *here*

That is, in pseudocode, I want 到 get <text> from {{i:<text>}} in a text file.

I don't mind which 到ol you use: grep, awk, ... This could be a beginning.

推荐答案

您可以使用Perl中的递归正则表达式来实现您想要的结果.这个正则表达式将匹配你的字符串,允许嵌套{{i:}}对:

{{i:((?>(?:(?!{{i:|}}).)+|(?R))*)}}

它匹配:

  • {{i:章:文字{{i:
  • ((?>(?:(?!{{i:|}}).)+|(?R))*) : zero or more (captured in group 1) of either
    • (?:(?!{{i:|}}).)+:一个或多个不在{{i:}}序列开头的字符(这是tempered greedy token);or
    • (?R):整个模式的递归
  • }}章:文字}}

Regex演示regex101

假设test.txt包含:

{{i:very long text with {some} [special](https://google.com) nested text *here*}}
{{i:hello {{i:hola}}}}

然后您可以:

perl -pe 's/{{i:((?>(?:(?!{{i:|}}).)+|(?R))*)}}/\1/' test.txt

输出:

very long text with {some} [special](https://google.com) nested text *here*
hello {{i:hola}}

Linux相关问答推荐

std::chrono::time_zone 在不同操作系统上不可用

使用ansible配置Linux VM使用vmware_vm_shell模块时变成su?

用于替换 struct 文档中文本的 Bash 脚本

将特定列转换为行

在android上使用lldb-server进行lldb调试?

如何在初始化脚本中以特定用户身份运行命令?

Linux/Unix 手册页语法约定

错误:命令gcc在 CentOS 上失败,退出状态为 1

如何比较两个压缩包的内容

在 bash 中检测公共 IP 地址的方法

低功耗蓝牙:在 linux 中监听通知/指示

用于 Linux 的 Less 编译器

scp 使用私钥身份验证将目录复制到另一台服务器

用于 ssh 的类似 teamviewer 的工具?

Linux 配置/制作,--prefix?

将标准输出作为命令行工具的文件名传递?

如何链接到 GCC 中特定版本的共享库

vscode 总是请求保存权限

如何编写 Mono 守护程序

如何计算一个单词在目录的所有文件中出现的次数?