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


10

例:

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

になるはずです:

This is 
that wants
 anyway.

フォーラムでいくつかの同様の スレッドを見つけましたが、それらは複数行の中括弧で動作しないようです。

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

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


1
これを試してくださいsed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Costas

回答:


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

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


あなたの答えは完璧なようです。私が開いたばかりの新しい質問(元の質問を読んでくださいEDIT)が完全に同じでない限り、あなたもそれに答えるべきだと思います。フォーラムのルールで問題ないでしょうか?
ソパラホデアリエーレス2014年

@ John1024、OPが同じ問題に関する新しい質問を投稿したときに、ここに編集を移動できます。
Ramesh 2014年

1
OK。あそこにコピーして、新しい質問のサンプルテキストを使用するように修正しました。
John1024 2014年

5

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 //'

ありがとう、これはとても役に立ちました!これは私が、ah..emとsedのに苦労対分以内に多くの時間を機能の内容を置き換えるためにビルドスクリプトの問題を解決する助け、私は(hours..cough..coughを)認める
AndrewD

4

セッド:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.