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


10

例:

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

应成为:

This is 
that wants
 anyway.

我在论坛中找到了一些类似的 主题,但是它们似乎不适用于多行大括号。

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

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


1
试试这个sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Costas

Answers:


10
$ 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。以此方式,替换命令将重复执行,直到除去所有大括号组为止。


您的答案似乎是完美的。只要我刚刚打开的新问题(阅读原始问题EDIT)不完全相同,我想您也应该回答。论坛规则可以吗?
Sopalajo de Arrierez,2014年

@ John1024,您可以将编辑移至此处,因为OP发布了与此相关的新问题。
拉梅什2014年

1
好。我已经将其复制到那里,并对其进行了修改,以在新问题中使用示例文本。
John1024

5

Perl:

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 //'

谢谢,这非常有帮助!这帮助我解决了一个构建脚本问题,可以在几分钟之内替换函数的内容,而不是用ah..em与sed苦苦挣扎,那么我会接受更多的时间(小时..咳嗽..咳嗽)
AndrewD

4

塞德:

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

从开始于,{并获得下一行(N),直到{}可以进行替换()为止(T表示:如果未进行替换,则返回到标记)

如果多条卷发夹在一行中,则需要一点修改

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

删除括号中的所有符号([^}]等于每个符号right bracket以使其sed不贪婪),如果行中仍保留left bracked,则返回-如果没有则返回下一行right bracket

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.