web-dev-qa-db-ja.com

複数行のテキストファイルで、中かっこの間のすべてのテキストを削除するにはどうすればよいですか?

例:

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

になるはずです:

This is 
that wants
 anyway.

フォーラムで similarthreads をいくつか見つけましたが、複数行の中括弧では機能しないようです。

可能であれば、grep、sed、awkなどに基づくソリューションなど、1行の方法を使用します。

編集:ソリューションは問題ないようですが、元のファイルに中括弧のネストが含まれていることに気づきました。だから私は新しい質問を開いています。みんなありがとう: 複数行テキストファイル内のネストされた中括弧の間のすべてのテキストを削除するにはどうすればよいですか?

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

説明:

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

    これにより、ファイル全体がパターンスペースに読み込まれます。

    :againはラベルです。 Nは次の行を読み取ります。 $!b againは、これが最後の行ではないという条件でagainラベルに分岐して戻ります。

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

    これにより、中括弧内のすべての式が削除されます。

Mac OSXでは、次のことを試してください。

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

ネストされたブレース

これを、中かっこが多数ネストされたテストファイルとしましょう。

a{b{c}d}e
1{2
}3{
}
5

ネストされた中括弧を処理するための変更を以下に示します。

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

説明:

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

    これは以前と同じです。ファイル全体を読み取ります。

  • :b

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

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

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

  • t b

    上記の置換コマンドで変更が生じた場合は、ラベルbに戻ります。このように、すべてのブレースグループが削除されるまで、代替コマンドが繰り返されます。

10
John1024

Perl:

Perl -0777 -pe 's/{.*?}//sg' file

その場で編集したい場合

Perl -0777 -i -pe 's/{.*?}//sg' file

これは、ファイルを単一の文字列として読み取り、グローバルな検索と置換を行います。

これはネストされたブレースを処理します:

Perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'
5
glenn jackman

セッド:

_sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
_

_{_で始まる行から始まり、置換(_{}_)ができるまで次の行(N)を取得します(Tは_:_置換しない場合)

1つの行に多数のカールが固定されている場合は、少し修正してtrueにします

_sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file
_

かっこ内のすべての記号を削除します(_[^}]_等号すべての記号exept _right bracket_を作成してsedを貪欲にしない)、および行内にある場合は_left bracked_-_right bracket_がない場合は、次の行を追加して最初に戻ります。

4
Costas