如何使用 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