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 theagain
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
.