这个问题来自 如何删除多行文本文件中大括号之间的所有文本?(只是一样,但没有嵌套的要求)。
例子:
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。以这种方式,重复替换命令,直到删除所有括号组。