複数行のテキストファイルから入れ子になった中かっこの間のすべてのテキストを削除する方法は?

複数行のテキストファイルから入れ子になった中かっこの間のすべてのテキストを削除する方法は?

この質問は以下から来ています。 複数行のテキストファイルから中括弧の間のすべてのテキストを削除する方法は?(同じですが、入れ子の要件はありません)。

例:

This is {
{the multiline
text} file }
that wants
{ to {be
changed}
} anyway.

次のようにする必要があります。

This is 
that wants
 anyway.

これを実行するために使用できる一行のbashコマンド(awk、sed、perl、grep、cut、tr ...など)はありますか?

ベストアンサー1

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file3
This is 
that wants
 anyway.

説明する:

  • :again;$!N;$!b again

    ファイル全体を読みます。

    :againラベルです。 N次の行を読み、$!N最後の行に達していない場合は、次の行を読みます。最後の行ではない場合は、ラベル$!b againに分岐します。again

  • :b

    これはラベルを定義しますb

  • s/{[^{}]*}//g

    これにより、テキストに内部括弧が含まれていない限り、中括弧内のテキストが削除されます。

  • t b

    上記の代替コマンドで変更が発生した場合は、labelに戻りますb。このようにして、すべてのガシグループが削除されるまで置換コマンドを繰り返します。

おすすめ記事