この質問は以下から来ています。 複数行のテキストファイルから中括弧の間のすべてのテキストを削除する方法は?(同じですが、入れ子の要件はありません)。
例:
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
。このようにして、すべてのガシグループが削除されるまで置換コマンドを繰り返します。