如何删除多行文本文件中嵌套大括号之间的所有文本?

Sop*_*rez 9 text-processing

这个问题来自 如何删除多行文本文件中大括号之间的所有文本?(只是一样,但没有嵌套的要求)。

例子:

This is {
{the multiline
text} file }
that wants
{ to {be
changed}
} anyway.
Run Code Online (Sandbox Code Playgroud)

应该变成:

This is 
that wants
 anyway.
Run Code Online (Sandbox Code Playgroud)

是否可以使用某种单行 bash 命令(awk、sed、perl、grep、cut、tr...等)来做到这一点?

Joh*_*024 13

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file3
This is 
that wants
 anyway.
Run Code Online (Sandbox Code Playgroud)

解释:

  • :again;$!N;$!b again

    这会读入整个文件。

    :again是一个标签。 N$!N我们尚未到达最后一行的情况下,读取下一行并读取下一行。 在这不是最后一行的条件下$!b again分支回again标签。

  • :b

    这定义了一个标签b

  • s/{[^{}]*}//g

    只要文本不包含内部大括号,这将删除大括号中的文本。

  • t b

    如果上述替换命令导致更改,请跳回 label b。以这种方式,重复替换命令,直到删除所有括号组。