Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

'Parser' un fichier (débutant)

12 réponses
Avatar
Ph. Ivaldi
Bonjour,

Je ne connais Rien à perl.
J'ai commencé à lire de la documentation mais je m'y perd et le temps
m'est compté...
Quelqu'un aurait-il la gentillesse de donner la commande perle qui
permet de modifier dans un fichier tous les bloques de la forme:

/*ANCune_ ancre_XANC*/
Du code...
Du code...
{/*DOC
De la documentation
De la documentation
DOC*/
Du code...
Du code...
}

en

<A une_ ancre_X></A>
Du code...
Du code...
{<B>
De la documentation
De la documentation
</B>
Du code...
Du code...
}
<C>blabla une_ ancre_X blabla</C>

Quels liens me conseillez vous pour apprendre *rapidement* ce genre de
commande ?
--
Merci de votre attention,
Philippe Ivaldi.
http://piprim.tuxfamily.org/

10 réponses

1 2
Avatar
Vincent Lefevre
Dans l'article ,
Ph. Ivaldi écrit:

Quels liens me conseillez vous pour apprendre *rapidement* ce genre de
commande ?


Sur <http://perldoc.perl.org/>, il y a un lien vers des tutoriels et
FAQs. Sinon Google, puis taper "tutoriel perl" ou "tutorial perl",
mais je ne sais pas si c'est très bon...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Bibi69
Bonjour,

Je ne connais Rien à perl.
J'ai commencé à lire de la documentation mais je m'y perd et le temps
m'est compté...
Quelqu'un aurait-il la gentillesse de donner la commande perle qui
permet de modifier dans un fichier tous les bloques de la forme:

/*ANCune_ ancre_XANC*/
Du code...
Du code...
{/*DOC
De la documentation
De la documentation
DOC*/
Du code...
Du code...
}

en

<A une_ ancre_X></A>
Du code...
Du code...
{<B>
De la documentation
De la documentation
</B>
Du code...
Du code...
}
<C>blabla une_ ancre_X blabla</C>

Quels liens me conseillez vous pour apprendre *rapidement* ce genre de
commande ?


Je ne suis pas un programmeur avancé mais voila ce que je ferais :

my $fichier=$ARGV[0];
open in, "< $fichier" or die;
open out, "> out.txt" or die;
my $l0 = <in>;
while ($l0)
{
$l0 =~ s//*ANCune_ ancre_XANC*//<A une_ ancre_X></A>/;
$l0 =~ s/{/*DOC/{<B>/;
$l0 =~ s/DOC*//</B>/;
$l0 =~ s/}/}n<C>blabla une_ ancre_X blabla</C>/;
print out $l0;
$l0=<in>;
}
close in;
close out;
rename("out.txt",$fichier) || die "Erreur au renommage : $!";
exit(0);

Je sauve ce fichier dans transform.pl et je fais 'perl transform.pl
mon_fichier_a_modifier'.
Voila, si certains programmeurx experimentés peuvent confirmer...

Avatar
Ph. Ivaldi
Le 21 février 2007 à 20h07:53,
Bibi69 écrivit :

Je ne suis pas un programmeur avancé mais voila ce que je ferais :

my $fichier=$ARGV[0];
open in, "< $fichier" or die;
open out, "> out.txt" or die;
my $l0 = <in>;
while ($l0)
{
$l0 =~ s//*ANCune_ ancre_XANC*//<A une_ ancre_X></A>/;
$l0 =~ s/{/*DOC/{<B>/;
$l0 =~ s/DOC*//</B>/;
$l0 =~ s/}/}n<C>blabla une_ ancre_X blabla</C>/;
print out $l0;
$l0=<in>;
}
close in;
close out;
rename("out.txt",$fichier) || die "Erreur au renommage : $!";
exit(0);

Je sauve ce fichier dans transform.pl et je fais 'perl transform.pl
mon_fichier_a_modifier'.


Je n'est pas été très clair:
le texte "une_ ancre_X" est un texte variable qui tient sur une seule
ligne.
J'aurais dû mettre "_Un-texte-x_" mais je pensais déjà au résultat.

Je modifie légèrement ma demande (je pense qu'elle est plus simple
grâce à la balise //EXA):
Transformer tous les bloques de la forme:

/*ANC_UN-texte-x_ANC*/
Du code...
Du code...
{/*DOC
De la documentation
De la documentation
DOC*/
Du code...
Du code...
}
//EXA

en:

<A _UN-texte-x_></A>
Du code...
Du code...
{<B>
De la documentation
De la documentation
</B>
Du code...
Du code...
}
<C>blabla _UN-texte-x_ blabla</C>


Je peux peut-être m'en sortir si l'on explique pourquoi ce code ne
supprime pas tout ce qui se trouve entre /*DOC et DOC*/ dans tous les
bloques commençant par /*ANC et se termiant par //EXA

perl -0777 -pe 's,/*ANC.*?//EXA,$_=$&;s//*DOC(.*?)DOC*///g;$_,seg' temp.txt

Je me suis inspiré d'un exemple que l'on m'a proposé pour autre chose.
Je ne comprends le sens de ',seg' à la fin de la commande (le reste
ressemble à du 'sed').

Merci de votre aide.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Avatar
Ph. Ivaldi
Le 21 février 2007 à 19h16:11,
Vincent Lefevre <vincent+ écrivit :

Sur <http://perldoc.perl.org/>, il y a un lien vers des tutoriels et
FAQs. Sinon Google, puis taper "tutoriel perl" ou "tutorial perl",
mais je ne sais pas si c'est très bon...


Merci!
Il y a aussi beaucoup (c'est rien de le dire) de documentation ici:
http://perl.enstimac.fr/
Mais je ne veux pas apprendre tout perl, j'aurais juste besoin de savoir
manipuler les commandes du style:
perl -0777 -pe 's......' fichier.txt
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Avatar
Benoit Izac
Bonjour,

le 21/02/2007 à 23:38, Ph. Ivaldi a écrit dans le message
:

Je peux peut-être m'en sortir si l'on explique pourquoi ce code ne
supprime pas tout ce qui se trouve entre /*DOC et DOC*/ dans tous les
bloques commençant par /*ANC et se termiant par //EXA

perl -0777 -pe
's,/*ANC.*?//EXA,$_=$&;s//*DOC(.*?)DOC*///g;$_,seg' temp.txt


Il manque un « s »
s//*DOC(.*?)DOC*///gs

s c'est pour que « . » corresponde aussi à une fin de ligne.

Je me suis inspiré d'un exemple que l'on m'a proposé pour autre chose.
Je ne comprends le sens de ',seg' à la fin de la commande (le reste
ressemble à du 'sed').


Tu devrais aérer ton code :

perl -0777 -pe 's{/*ANC.*?//EXA}
{$_=$&;
s//*DOC(.*?)DOC*///gs;
$_}segx;' temp.txt

pour l'explication sur s, e, g et x :
perldoc perlop
puis chercher s/PATTERN/REPLACEMENT/egimosx

--
Benoit Izac

Avatar
Ph. Ivaldi
Le 22 février 2007 à 00h16:45,
Benoit Izac écrivit :

pourquoi ce code ne
supprime pas tout ce qui se trouve entre /*DOC et DOC*/ dans tous les
bloques commençant par /*ANC et se termiant par //EXA

perl -0777 -pe
's,/*ANC.*?//EXA,$_=$&;s//*DOC(.*?)DOC*///g;$_,seg' temp.txt


Il manque un « s »
s//*DOC(.*?)DOC*///gs

s c'est pour que « . » corresponde aussi à une fin de ligne.

Tu devrais aérer ton code :

perl -0777 -pe 's{/*ANC.*?//EXA}
{$_=$&;
s//*DOC(.*?)DOC*///gs;
$_}segx;' temp.txt


Nickel!
Une commande qui correspond à ce que je veux est donc:
perl -0777 -pe
's{/*ANC.*?//EXA}
{$_=$&;
s//*ANC(.*?)ANC*/(.*?)/*DOC(.*?)DOC*/(.*?)//EXA/
<A1></A>2<B>3</B>4<C>blabla 1 blabla</C>/gs;$_}segx' temp.txt

pour l'explication sur s, e, g et x :
perldoc perlop
puis chercher s/PATTERN/REPLACEMENT/egimosx


e Évaluez la partie droite comme une expression.
g Substitution globale, c.-à-d. toutes les occurrences.
i Motif indépendant de la casse (majuscules/minuscules).
m Traitement de chaîne comme étant multi-lignes.
o Compilation du motif uniquement la première fois.
s Traitement de la chaîne comme étant une seule ligne.
x Utilisation des expressions rationnelles étendues.

MERCI!
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/


Avatar
Vincent Lefevre
Dans l'article ,
Ph. Ivaldi écrit:

Mais je ne veux pas apprendre tout perl, j'aurais juste besoin de savoir
manipuler les commandes du style:
perl -0777 -pe 's......' fichier.txt


Tu peux aller voir dans la doc directement ce qui t'intéresse.

Concernant les pages du manuel, ça correspond à perlre (sur les regexp)
et un bout de perlop (sur l'utilisation de s/.../.../).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Vincent Lefevre
Dans l'article ,
Benoit Izac écrit:

s//*DOC(.*?)DOC*///gs


En général, j'évite d'utiliser comme séparateur un caractère qui se
trouve dans l'une des deux expressions. J'écrirais donc ici:

s!/*DOC(.*?)DOC*/!!gs

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Ph. Ivaldi
Crosspost & Followup-To: fr.comp.os.unix

J'ai encore un problème...
Dans un script bash j'ai ce code, dont j'attends qu'il supprime tout le
texte compris entre les mots ANC et EXA:

RESTRICT="ANC.*?EXA"
MATCH=".*"
PERL="'s,${RESTRICT},"'$_=$&'";s/${MATCH}//gs;"'$_'",segx'"
perl -0777 -pe "$PERL" fichier.txt
echo $PERL

mais ça ne marche pas.
Pourtant si je remplace "$PERL" par la sortie de "echo $PERL", ça
fonctionne.
Comment faire pour utiliser la variable $PERL (plus compliquée à
construire en réalité) dans la commande perl ?
--
Merci de votre aide,
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Benoit Izac
Bonjour,

le 22/02/2007 à 20:15, Ph. Ivaldi a écrit dans le message
:

Dans un script bash j'ai ce code, dont j'attends qu'il supprime tout
le texte compris entre les mots ANC et EXA:

RESTRICT="ANC.*?EXA"
MATCH=".*"
PERL="'s,${RESTRICT},"'$_=$&'";s/${MATCH}//gs;"'$_'",segx'"
perl -0777 -pe "$PERL" fichier.txt
echo $PERL

mais ça ne marche pas.
Pourtant si je remplace "$PERL" par la sortie de "echo $PERL", ça
fonctionne.
Comment faire pour utiliser la variable $PERL (plus compliquée à
construire en réalité) dans la commande perl ?


Pourquoi ne pas remplacer ce script bash par un script tout en Perl ?

--
Benoit Izac

1 2