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

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

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

如果我有一个包含以下内容的文件:

随机
文本
//开始文本
内部
文本
//结束语
更加
随机
//开始文本
asdf
//结束语
文本

我怎样才能删除开始/结束行内的所有文本块,并产生以下内容?

随机
文本
更多
随机
文本

答案1

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

答案2

在 Perl 中执行此操作的正确方法是使用 Perl 的触发器运算符

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

Perl 中的 x..y 计算结果为真,从 x 为真开始,到 y 为真结束。m{} 是编写正则表达式匹配的另一种方式,因此我们不必疯狂地将所有正斜杠都反斜杠化。

答案3

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

}

./removeblocks < 某个文本文件 > 另一个文本文件

答案4

简单状态机:

#!/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

尽管我相信您的示例,Florian 的逻辑是正确的,但它将打印//END TEXT以下(格式错误的)输入:

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

相关内容