例:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
になるはずです:
This is
that wants
anyway.
フォーラムで similarthreads をいくつか見つけましたが、複数行の中括弧では機能しないようです。
可能であれば、grep、sed、awkなどに基づくソリューションなど、1行の方法を使用します。
編集:ソリューションは問題ないようですが、元のファイルに中括弧のネストが含まれていることに気づきました。だから私は新しい質問を開いています。みんなありがとう: 複数行テキストファイル内のネストされた中括弧の間のすべてのテキストを削除するにはどうすればよいですか?
$ 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
に戻ります。このように、すべてのブレースグループが削除されるまで、代替コマンドが繰り返されます。
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 //'
セッド:
_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
_がない場合は、次の行を追加して最初に戻ります。