2

请帮我删除文件中的特定块。

输入就像,

<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
4

3 回答 3

4

您仍然可以使用触发器运算符,但将其反转并匹配第 2 节的开头和结尾:

perl -ne 'print unless /^<section_begin> a02$/ .. /^<section_end>$/' a1exp

unless表示if not,因此只要表达式匹配,它就不会打印。只要 LHS(左侧)返回 false,触发器本身就会返回 false,然后返回 true,直到 RHS 返回 true,然后复位。在文档中阅读更多内容。

这也可以用于通过在打印之前缓存该部分来检查该部分是否包含关键字。

perl -ne 'if (/^<section_begin>/ .. /^<section_end>/) { $sec .= $_ }; 
          if (/^<section_end>/) { print $sec if $sec !~ /eld/; $sec = "" }' 
于 2013-08-29T09:22:46.183 回答
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>

我在这里设置了一个布尔变量来控制应该跳过的部分。为了确保跳过块的末尾部分也将被跳过,我使用了一个 temp_bool 变量。

于 2013-08-29T08:02:35.227 回答
2

在这种情况下,直接的解决方案可能是最好的:

perl -ne '/<section_begin> (.+)/;print if $1 ne "a02"' a1exp

$1每次正则表达式看到新部分时都会更新,然后您只需打印不在“a02”部分中的所有内容。

于 2013-08-29T08:02:47.643 回答