Comment puis-je supprimer tout le text entre accolades dans un file text multiligne?

Exemple:

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

Devraient devenir:

 This is that wants anyway. 

J'ai trouvé des discussions similaires dans le forum, mais elles ne semblent pas fonctionner avec des accolades multilignes.

Si possible, je préférerais une méthode à une ligne, comme les solutions basées sur grep, sed, awk … etc.

EDIT: Les solutions semblent être OK, mais j'ai remarqué que mes files d'origine include des accolades. Donc, j'ouvre une nouvelle question. Merci à vous tous: Comment puis-je supprimer tout le text entre accolades nestedes dans un file text multiligne?

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

Explication:

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

    Cela lit le file entier dans l'espace de model.

    :again une :again c'est une label. N lit dans la ligne suivante. $!b again twigs à l'label à again à la condition que ce ne soit pas la dernière ligne.

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

    Cela supprime toutes les expressions entre accolades.

Sur Mac OSX, essayez:

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

Attelles emboîtées

Prenons ceci comme un file de test avec beaucoup d'accolades nestedes:

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

Voici une modification pour gérer les accolades nestedes:

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

Explication:

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

    C'est la même chose qu'avant: il lit dans le file entier.

  • :b

    Cela définit une label b .

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

    Cela supprime le text entre accolades tant que le text ne contient pas d'accolades internes.

  • tb

    Si la command de rlocation ci-dessus a entraîné une modification, revenez à l'label b . De cette façon, la command de rlocation est répétée jusqu'à ce que tous les groupes d'accolades soient supprimés.

Perl:

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

Si vous voulez éditer sur place

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

Cela lit le file sous forme de string unique et effectue une search et un rlocation globaux.

Cela permettra de gérer nesteds emboîtés:

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

Sed:

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

a commencé depuis la ligne avec { et get la ligne suivante ( N ) jusqu'à ce que la substitution ( {} ) puisse être faite ( T signifie return à la marque faite par : si la substitution n'est pas faite)

Un peu modifier pour être vrai si beaucoup de curle a été relâché en une seule ligne

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

Supprimez tous les symboles entre parenthèses ( [^}] égaux à tous les symboles sauf right bracket pour que sed ne soit pas gourmand) et si dans la ligne restz à left bracked arrière pour commencer avec la ligne suivante ajoutée s'il n'y a pas de right bracket .