OVH Cloud OVH Cloud

Substitution multiligne 2

3 réponses
Avatar
Jean-Paul Lauque
Bonjour,

Voici mon problème.

J'ai un fichier SGML qui contient des choses comme :

<BALISE1>.</BALISE1>
<BALISE1>
.</BALISE1>
<BALISE1>
,</BALISE1>
<BALISE1>,</BALISE1>

Or, je devrais avoir :

<BALISE1>.</BALISE1>
<BALISE1>.</BALISE1>
<BALISE1>,</BALISE1>
<BALISE1>,</BALISE1>

J'ai donc fait un petit programme Perl qui le remet dans la bonne forme.

J'utilise une boucle qui lit le fichier, met son contenu dans une variable
et supprime
les retours chariot en trop.

Cependant, pour ma culture personnelle, pourriez-vous me dire comment
supprimer le retour chariot en trop, dans toute l'instance, en utilisant une
regexp
multiligne ?

Merci d'avance

JP

3 réponses

Avatar
Marc
Jean-Paul Lauque wrote:

Bonjour,

Voici mon problème.

J'ai un fichier SGML qui contient des choses comme :

<BALISE1>.</BALISE1>
<BALISE1>
.</BALISE1>
<BALISE1>
,</BALISE1>
<BALISE1>,</BALISE1>

Or, je devrais avoir :

<BALISE1>.</BALISE1>
<BALISE1>.</BALISE1>
<BALISE1>,</BALISE1>
<BALISE1>,</BALISE1>

J'ai donc fait un petit programme Perl qui le remet dans la bonne
forme.

J'utilise une boucle qui lit le fichier, met son contenu dans une
variable et supprime
les retours chariot en trop.

Cependant, pour ma culture personnelle, pourriez-vous me dire
comment supprimer le retour chariot en trop, dans toute l'instance,
en utilisant une regexp
multiligne ?

Merci d'avance

JP


En supposant que tu veux enlever les n ou r à la fin de la chaine de
caractères
$_ =~ s![nr]+$!!;


En supposant que tu veux enlever les n ou r > 1 dans toute la chaine
de caractères
$_ =~ s!(n|r)+!$1!g;


Cordialement
Marc Dierick

Avatar
Michel Rodriguez
Jean-Paul Lauque wrote:

Bonjour,

Voici mon problème.

J'ai un fichier SGML qui contient des choses comme :

<BALISE1>.</BALISE1>
<BALISE1>
.</BALISE1>
<BALISE1>
,</BALISE1>
<BALISE1>,</BALISE1>

Or, je devrais avoir :

<BALISE1>.</BALISE1>
<BALISE1>.</BALISE1>
<BALISE1>,</BALISE1>
<BALISE1>,</BALISE1>

J'ai donc fait un petit programme Perl qui le remet dans la bonne forme.

J'utilise une boucle qui lit le fichier, met son contenu dans une variable
et supprime les retours chariot en trop.

Cependant, pour ma culture personnelle, pourriez-vous me dire comment
supprimer le retour chariot en trop, dans toute l'instance, en utilisant
une regexp multiligne ?


Ca ca devrait marcher, sauf cas un > dans le texte (possible en SGML comme
en XML) viendrait interferer:

#!/usr/bin/perl -w
use strict;

undef $/; # pour lire tout le fichier d'un coup
my $sgml=<DATA>;
$sgml=~ s{> # fin de balise
n # retour a la ligne
(?=[^<]) # suivi de tout sauf d'un debut de balise
# (avec un lookahead pour faire joli et
# eviter de memoriser le caractere dans $1)
}
{>}xg; # x pour pouvoir commenter, g pour global
print $sgml;

__DATA__
<BALISE1>.</BALISE1>
<BALISE1>
.</BALISE1>
<BALISE1>
,</BALISE1>
<BALISE1>,</BALISE1>



__
Michel Rodriguez
Perl &amp; XML
http://xmltwig.com

Avatar
dominix
"Jean-Paul Lauque" wrote in message
news:bjig3p$ftb$
Bonjour,

Voici mon problème.

...

Cependant, pour ma culture personnelle, pourriez-vous me dire comment
supprimer le retour chariot en trop, dans toute l'instance, en utilisant
une

regexp multiligne ?



le principe pour le multiligne c'est d'avoir les retour de lignes dans
la(les) variables, il faut donc redefinir $/ ou utiliser -0 en ligne
de commande ou #!perl -00 pour lire la var depuis un fichier.
ensuite dans la regexp il y a le switch /s pour inclure les "n"

ex:
#!/usr/bin/perl
undef $/;
while (<>) {
s/n//gs;
print;
}

ou bien
perl -00pe 's/n//gs'