使用perl regex从文件中删除特定行

时间:2013-08-29 07:20:48

标签: regex perl

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

输入就像,

<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

3 个答案:

答案 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”部分中的所有内容。