Exemple:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Devrait devenir:
This is
that wants
anyway.
J'ai trouvé des fils similaires sur le forum, mais ils ne semblent pas fonctionner avec des accolades multi-lignes.
Si possible, je préférerais une méthode en ligne, comme des solutions basées sur grep, sed, awk ... etc.
EDIT: Les solutions semblent être correctes, mais j'ai remarqué que mes fichiers d'origine incluent l'imbrication des accolades. J'ouvre donc une nouvelle question. Merci à tous: Comment supprimer tout le texte entre des accolades imbriquées dans un fichier texte multiligne?
text-processing
sed
awk
grep
Sopalajo de Arrierez
la source
la source
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Réponses:
Explication:
:again;$!N;$!b again;
Ceci lit le fichier entier dans l'espace modèle.
:again
est une étiquette.N
lit dans la ligne suivante.$!b again
ramène à l'again
étiquette à condition que ce ne soit pas la dernière ligne.s/{[^}]*}//g
Cela supprime toutes les expressions entre accolades.
Sur Mac OSX, essayez:
Accolades imbriquées
Prenons cela comme un fichier de test avec beaucoup d'accolades imbriquées:
Voici une modification pour gérer les accolades imbriquées:
Explication:
:again;$!N;$!b again
C'est la même chose qu'avant: il lit dans tout le fichier.
:b
Cela définit une étiquette
b
.s/{[^{}]*}//g
Cela supprime le texte entre accolades tant que le texte ne contient pas d'accolades internes.
t b
Si la commande de substitution ci-dessus a entraîné une modification, revenez à l'étiquette
b
. De cette façon, la commande de substitution est répétée jusqu'à ce que tous les groupes d'accolades soient supprimés.la source
EDIT
) n'est pas exactement la même, je pense que vous devriez également y répondre. Serait-ce OK avec les règles du forum?Perl:
Si vous souhaitez éditer sur place
Cela lit le fichier comme une chaîne unique et effectue une recherche et un remplacement global.
Cela gérera les contreventements imbriqués:
la source
Sed:
commencé depuis la ligne avec
{
et obtenir la ligne suivante (N
) jusqu'à ce que la substitution ({}
) puisse être effectuée (T
signifie retourner à la marque faite par:
si la substitution n'est pas effectuée)Un peu modifier pour être vrai si plusieurs boucles sont entre crochets sur une seule ligne
Retirez tous les symboles dans les crochets (
[^}]
égale à tous les exepté symboleright bracket
fairesed
pas gourmand), et si la ligne resteleft bracked
- retour au début avec la ligne suivante ajouté s'il n'y a pasright bracket
.la source