パターンが見つかったら、中かっこブロックを削除します。

パターンが見つかったら、中かっこブロックを削除します。

{}ブロック内でパターンが見つかったら、中括弧ブロック+「名前」(2単語プレフィックス)を削除したいと思います。魔法を
少し使ってみましたが、sed効果がありませんでした。
たとえば、

  • パターン:パターンパターン-X

入力する

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
        c c2 {  
            PATTERN PATTERN-X  
            ...  
        }  
        s s4;
    }  
    c c3 {  
        PATTERN PATTERN-X  
        ...
        c c4 {
            s s4;
        }
    }  
}

出力

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
        s s4;
    }  
}

答え1

これを試してみてください。

awk '
$0~/{/{
  if(b) {
    print b
  b=""
  }
  if(c)
    c++
}
$0~/PATTERN/ {
  b=""
  c=2
}
$0~/}/ {
  if(c)
    c--
}
!c {
  if(b)
    b=b RS
  b=b $0
}
END {
  print b
}
' infile

答え2

この例のように、機能言語を解析するのは一般的に良い考えではありません。正規表現を処理するように設計された解析ツールは、人間の言語でうまく機能します。そうですが…まだ試してみることはできます。

これが私が使用する方法ですpcregrep

pcregrep -Mv '.*{.*\n.*PATTERN(([^{}]|\n)*|([^{}]|\n)*{([^{}]|\n)*}.*([^{}]|\n)*)}.*' file

あなたの例とうまく動作します。つまり、{}後ろにブロック深さが0または1つありますPATTERN。複数のブロックがある場合は、必要に応じて拡張できます。

出力:

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
    }  
}

関連情報