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 を返し、RHS が true を返すまで 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>

ここでは、スキップする部分を制御する bool 変数を設定します。スキップされたブロックの最後の部分もスキップされるように、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 に答える