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

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

例子:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

应该变成:

This is 
that wants
 anyway.

我找到了一些相似的 线程在论坛中,但它们似乎不适用于多行大括号。

如果可能的话,我更喜欢一些单行方法,例如基于 grep、sed、awk...等的解决方案。

编辑:解决方案似乎没问题,但我注意到我的原始文件包含大括号嵌套。所以我提出一个新问题。谢谢大家:如何删除多行文本文件中嵌套大括号之间的所有文本?

答案1

$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is 
that wants
 anyway.

解释:

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

    这会将整个文件读入模式空间。

    :again是一个标签。 N读入下一行。 $!b again分支回到again标签,条件是这不是最后一行。

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

    这将删除大括号中的所有表达式。

在 Mac OSX 上,尝试:

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

嵌套大括号

让我们将此作为带有大量嵌套大括号的测试文件:

a{b{c}d}e
1{2
}3{
}
5

这是处理嵌套大括号的修改:

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

解释:

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

    这与以前相同:它读入整个文件。

  • :b

    这定义了一个标签b

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

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

  • t b

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

答案2

珀尔:

perl -0777 -pe 's/{.*?}//sg' file

如果您想就地编辑

perl -0777 -i -pe 's/{.*?}//sg' file

它将文件作为单个字符串读取并进行全局搜索和替换。

这将处理嵌套支撑:

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'

答案3

塞德:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

从 行开始{并获取下一行 ( N) 直到{}可以进行替换 ( ) (表示如果未进行替换则T返回到由 所做的标记):

如果一行中包含许多卷曲,请稍加修改即可

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

删除括号中的所有符号 ([^}]等于每个符号除了right bracket使sed不贪婪),并且如果在该行中保留left bracked- 如果没有,则返回到添加的下一行开始right bracket

相关内容