How can I delete all text between curly brackets in a multiline text file?

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

Explanation:

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

    This reads the whole file into the pattern space.

    :again is a label. N reads in the next line. $!b again branches back to the again label on the condition that this is not the last line.

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

    This removes all expressions in braces.

On Mac OSX, try:

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

Nested Braces

Let's take this as a test file with lots of nested braces:

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

Here is a modification to handle nested braces:

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

Explanation:

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

    This is the same as before: it reads in the whole file.

  • :b

    This defines a label b.

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

    This removes text in braces as long as the text contains no inner braces.

  • t b

    If the above substitute command resulted in a change, jump back to label b. In this way, the substitute command is repeated until all brace-groups are removed.


Perl:

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

If you want to edit in-place

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

That reads the file as a single string and does a global search-and-replace.

This will handle nested braced:

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

Sed:

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

started since line with { and get the next line (N) until substitution ({}) can be made ( T means return to mark made by : if substitution isn't made)

A little bit modify to be true if many curle bracked in one line

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

Remove all symbols in the brackets ([^}] equal every symbol exept right bracket to make sed not greedy), and if in the line remain left bracked - back to start with next line added if there isn't right bracket.