如何删除文件中的标记块文本?

如何使用sedgrep或其他程序删除文件中标记块的所有实例?

如果我有一个文件,其中包含:

随机
文本
// 开始文本
内部
文本
// 结束文本
更多
随机
// 开始文本
ASDF
// 结束文本
文本

如何删除开始/结束行中的所有文本块,产生以下内容?

随机
文本
更多
随机
文本

sed '\:// START TEXT:,\:// END TEXT:d' file 

Perl中正确的方法是使用Perl的触发器操作符

 perl -ne'print unless m{^// START TEXT}..m{^// END TEXT}' 

在Perl中x..y的计算结果是true,以x为真,并在y为真时结束。 m {}是写正则expression式匹配的另一种方法,所以我们不必疯狂地反斜杠所有的正斜杠。

 #!/usr/bin/nawk -f BEGIN { startblock="^/\/\ START TEXT" endblock="^/\/\ END TEXT" } { if(! match($0,startblock)) { { print } } else { while ( !match($0,endblock )) { getline; } } } 

./removeblocks <sometextfile> anothertextfile

Perl的:

 perl -ne '$t=1 if /^\/\/ START TEXT/; print if !$t; $t=0 if /^\/\/ END TEXT/' < sometextfile >anothertextfile 

简单的状态机:

 #!/usr/bin/perl my $inblock = 0; while (<>) { if (/^\/\/ START TEXT/) { $inblock=1; } elsif (/^\/\/ END TEXT/) { $inblock=0; } elsif ( ! $inblock) { print; } } 

用法示例:

 cat testfile | perl remove_block.pl random text more random text 

虽然弗洛里安的逻辑是合理的,但我相信你的例子,它会打印/ //END TEXT与以下(格式不正确)的input:

 random text // START TEXT internal text // END TEXT // END TEXT more random // START TEXT asdf // END TEXT text 

呆子:

 BEGIN { s = 0 } s == 1 && $0 ~ /^\/\/ END TEXT$/ { s = 0 next } s == 1 { next } /^\/\/ START TEXT$/ { s = 1 next } { print }