Sop*_*rez 12 grep sed awk 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)
我在论坛中发现了一些类似的 主题,但它们似乎不适用于多行大括号。
如果可能,我更喜欢一些单行方法,例如基于 grep、sed、awk 等的解决方案。
编辑:解决方案似乎没问题,但我注意到我的原始文件包含大括号嵌套。所以我提出了一个新问题。谢谢大家:如何删除多行文本文件中嵌套大括号之间的所有文本?
Joh*_*024 12
$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is
that wants
anyway.
Run Code Online (Sandbox Code Playgroud)
解释:
: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
Run Code Online (Sandbox Code Playgroud)
让我们把它当作一个有很多嵌套大括号的测试文件:
a{b{c}d}e
1{2
}3{
}
5
Run Code Online (Sandbox Code Playgroud)
这是处理嵌套大括号的修改:
$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5
Run Code Online (Sandbox Code Playgroud)
解释:
:again;$!N;$!b again
这和以前一样:它读入整个文件。
:b
这定义了一个标签b
。
s/{[^{}]*}//g
只要文本不包含内部大括号,这将删除大括号中的文本。
t b
如果上述替换命令导致更改,请跳回 label b
。以这种方式,重复替换命令,直到删除所有括号组。
珀尔:
perl -0777 -pe 's/{.*?}//sg' file
Run Code Online (Sandbox Code Playgroud)
如果您想就地编辑
perl -0777 -i -pe 's/{.*?}//sg' file
Run Code Online (Sandbox Code Playgroud)
它将文件作为单个字符串读取并执行全局搜索和替换。
这将处理嵌套支撑:
perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'
Run Code Online (Sandbox Code Playgroud)