请帮我删除文件中的特定区块。
输入就像,
<section_begin> a01
dfasd
adfa
<section_end>
<section_begin> a02
..
eld
...
1 error reported
...
<section_end>
<section_begin> a03
qwre
adfa
<section_end>
我想删除特定的块
<section_begin> a02
..
search_string
...
<section_end>
以下命令也会返回第一部分。
perl -ne 'print if /<section_begin>/../eld/' a1exp
答案 0 :(得分:4)
你仍然可以使用flip-flop operator,但是将其反转并匹配第2部分的开头和结尾:
perl -ne 'print unless /^<section_begin> a02$/ .. /^<section_end>$/' a1exp
unless
表示if not
,因此只要表达式匹配就不会打印。只要LHS(左侧)返回false,触发器本身就会返回false,然后返回true直到RHS返回true,之后它被重置。请在documentation。
在通过在打印前缓存该部分来检查某个部分是否包含关键字时,也可以使用此选项。
perl -ne 'if (/^<section_begin>/ .. /^<section_end>/) { $sec .= $_ };
if (/^<section_end>/) { print $sec if $sec !~ /eld/; $sec = "" }'
答案 1 :(得分:2)
您可以尝试使用类似的东西:
#!/usr/bin/perl
use strict;
use warnings;
my $bool = 0;
while (my $line = <DATA>) {
if ($line =~ /section_end/) {
my $temp_bool = $bool;
$bool = 0;
next if $temp_bool;
}
$bool = 1 if ($line =~ /section_begin/ && $line =~ /a02/ );
next if $bool;
print $line;
}
__DATA__
<section_begin> a01
dfasd
adfa
<section_end>
<section_begin> a02
..
eld
...
1 error reported
...
<section_end>
<section_begin> a03
qwre
adfa
<section_end>
我在这里设置了一个bool变量来控制应跳过的部分。为了确保跳过块的结尾部分也会被跳过,我使用了temp_bool变量。
答案 2 :(得分:2)
在这种情况下,直接的解决方案可能是最好的:
perl -ne '/<section_begin> (.+)/;print if $1 ne "a02"' a1exp
每次正则表达式看到新的部分时, $1
都会更新,然后您只打印不在“a02”部分中的所有内容。