
{}
ブロック内でパターンが見つかったら、中括弧ブロック+「名前」(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;
}
}