如何使用sed,grep或其他程序删除文件中标记块的所有实例?
如果我有一个文件,其中包含:
随机
文本
// 开始文本
内部
文本
// 结束文本
更多
随机
// 开始文本
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 }