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