cerhu > comp.lang.* > comp.lang.perl

Olivier Miakinen (03/10/2018, 02h41)
Bonjour,

Bien que ne connaissant pas Perl, j'ai l'impression que ce langage
doit être le plus approprié pour ce que je veux faire. En gros,
j'ai des fichiers contenant des textes écrits en tchèque (avec
majuscules et minuscules) que je voudrais convertir en API
(alphabet phonétique international). Du coup, j'aimerais pouvoir
écrire un script à lancer depuis un shell de type bash, que je
puisse utiliser de la façon suivante :
le_script fichier_source > fichier_destination

Par exemple, si le_script contient sous une forme ou une autre
les commandes de conversion suivante :
------------------------
s/?/?/gi
s/é/e:/gi
s/e/?/gi
------------------------

et si fichier_source a le contenu suivant :
------------------------
?itné pole, ?itné pole,
jak to zraje vesele!
------------------------

alors j'obtiendrai ceci dans fichier_destination :
------------------------
?itn?: pol?, ?itn?: pol?,
jak to zraj? v?s?l?!
------------------------

Remarquer d'une part que le ? et le ? ont tous deux été
remplacés par ? ; d'autre part que les é sont d'abord
devenus e: (s/é/e:/) avant de devenir ?: (s/e/?/).

Cordialement,
Marc Espie (04/10/2018, 14h52)
In article <pp138m$2dpf$1>,
Olivier Miakinen <om+news> wrote:
[..]
>------------------------
>?itn?: pol?, ?itn?: pol?,
>jak to zraj? v?s?l?!
>------------------------
>Remarquer d'une part que le ? et le ? ont tous deux été
>remplacés par ? ; d'autre part que les é sont d'abord
>devenus e: (s/é/e:/) avant de devenir ?: (s/e/?/).
>Cordialement,


Et c'est quoi la question ?

Oui c'est approprie.

T'as essentiellement juste a ecrire tes substitutions dans ton script
man perlrun
te donnera les bonnes options pour que ca s'applique a tout ce que tu
veux,

e.g.,

perl -pi.bak -e 's/E/e/g;'

te convertit tous tes E majuscules en minuscules par exemple.

Selon ton encodage, ca peut etre un peu plus funky.

man perlunifaq

pour en savoir plus
Olivier Miakinen (04/10/2018, 22h04)
Bonjour Marc,

Le 04/10/2018 14:52, Marc Espie m'a répondu :
>>[...] être le plus approprié [...]
>>------------------------
>>s/Å?/Ê’/gi
>>s/é/e:/gi
>>s/e/É›/gi
>>------------------------
>> [...]


Oh ! ;-)

> Et c'est quoi la question ?


C'est vrai que si ton nouvelleur ne sait pas lire l'UTF-8, tu dois avoir
du mal à comprendre une question dans laquelle j'ai mis des caractères
tchèques et des caractères de l'alphabet phonétique international !

Ma question était : qu'écrire dans un script shell (ou peut-être un
script perl avec le bon « shebang » au début) pour enchaîner plusieurs
substitutions sur tout le contenu d'un fichier, et envoyer le résultat
dans un autre fichier.

> Oui c'est approprie.
> T'as essentiellement juste a ecrire tes substitutions dans ton script
> man perlrun
> te donnera les bonnes options pour que ca s'applique a tout ce que tu
> veux,


Je n'ai pas ce man. Bien sûr j'ai fait « perl --help » et « man perl »,
qui m'ont donné quelques infos, et j'ai aussi essayé la commande perldoc
mais je ne l'ai pas non plus et je n'avais pas envie de l'installer
avant de savoir si je vais vraiment utiliser perl.

Sur le web j'ai trouvé des exemples avec perl -pe mais aucun exemple
avec plusieurs substitutions de suite. Du coup je ne savais pas trop
si je pouvais mettre plusieurs -pe de suite, un seul -p suivi de
plusieurs -e, ou encore un seul -pe suivi de plusieurs commandes
de substitution non toutes précédées de -e ou -pe.

> e.g.,
> perl -pi.bak -e 's/E/e/g;'


Mais c'est toujours une seule substitution, or j'en ai une bonne
trentaine de suite à faire à chaque fichier. De plus, d'après le
« perl --help », l'option i ne convient pas à ce que j'ai décrit
(mais que tu as sans doute eu du mal à lire en UTF-8), à savoir
que je ne veux pas modifier le fichier source.

> [...]


Finalement, j'ai découvert entretemps la commande :source dans l'éditeur
vim, et cette commande me va très bien. J'ai même pu commenter mes
substitutions. Pour ceux que cela pourrait intéresser, voici le fichier
convert.vim que j'exécute au moyen de « :source convert.vim » :
================================================== =====================
" Toutes les lettres tchèques
" aábc?d?eé?fghiíjklmn?oópqr?s?t?uú?vwxyýz?

" Voyelles
" aáeé?iíoóuú?yý

" Consonnes et semi-voyelles
" bc?d?fghjklmn?pqr?s?t?vwxz?

" On passe tout en minuscules
%s/.*/\L&/

" consonne + (l ou r) + autre chose qu'une voyelle -> on ajoute un schwa ?
%s/\([bc?d?fghjklmn?pqr?s?t?vwxz?]\)\([lr]\)\([^aáeé?iíoóuú?yý]\|$\)/\1?\2\3/g

" ? en finale donne ?, sinon donne ?
%s/?\([^aábc?d?eé?fghiíjklmn?oópqr?s?t?uú?vwxyýz?]\|$\)/?\1/g
%s/?/?/g

" autres substitutions - voyelles
%s/á/a?/g
%s/e/?/g
%s/é/??/g
%s/?/j?/g
%s/[iy]/?/g
%s/[íý]/i?/g
%s/o/?/g
%s/ó/??/g
%s/u/?/g
%s/[ú?]/u?/g

" autres substitutions - consonnes
%s/x/ks/g
%s/ch/x/g
%s/c/ts/g
%s/?/t?/g
%s/?/dj/g
%s/h/?/g
%s/?/?/g
%s/q/kv/g
%s/?/r?/g
%s/?/?/g
%s/?/tj/g
%s/w/v/g
================================================== =====================

Bon, ce n'est pas encore aujourd'hui que j'aurai la motivation de me
mettre à Perl. Désolé.
Marc Espie (08/10/2018, 21h07)
In article <pp5ron$1n3p$1>,
Olivier Miakinen <om+news> wrote:
>Je n'ai pas ce man. Bien sûr j'ai fait « perl --help » et « man perl »,
>qui m'ont donné quelques infos, et j'ai aussi essayé la commande perldoc
>mais je ne l'ai pas non plus et je n'avais pas envie de l'installer
>avant de savoir si je vais vraiment utiliser perl.


Bah, t'aurais insiste un poil, je suis bien certain que toute cette doc se
trouve sur le net..

Genre:

[..]

C'est pas comme si j'avais eu a chercher.

Je ne sais pas sur quoi tu bosses, mais il doit bien y avoir les packages idoines
complets pour perl, hein, doc y comprise...

(desole pour l'utf8, mais je ne vais pas abandonner mon vieux trn des familles).

Pour le reste, oui bien sur que tu peux mettre plusieurs -e.

Et perlrun te documente exactement ce que fait -i.bak

donc du coup, reecrire la meme chose a la main c'est assez trivial...
et du coup faire des substitutions vers d'autres fichiers.

Pareil pour le cote unicode, hein.

Bon, t'as trouve une solution "manuelle" dans vim, pourquoi pas ?
Olivier Miakinen (08/10/2018, 22h54)
Le 08/10/2018 21:07, Marc Espie a ?crit :
> In article <pp5ronn3p>,
> Olivier Miakinen <om+news> wrote:
> Bah, t'aurais insiste un poil, je suis bien certain que toute cette doc se
> trouve sur le net..
> Genre:
> [..]
> C'est pas comme si j'avais eu a chercher.


Ah, par le fait je l'avais trouv?e, et lue... mais sans y trouver ce
que je cherchais.

Est-ce parce que je suis trop nul en anglais ? C'est possible.
Peut-?tre aussi que c'est parce qu'il y a trop d'infos qui n'ont rien
? voir avec ce que je cherchais. Ou alors c'est parce que ce que je
cherchais ne s'y trouve tout simplement pas.

> Je ne sais pas sur quoi tu bosses, mais il doit bien y avoir les packages idoines
> complets pour perl, hein, doc y comprise...


En l'occurrence je bosse sur la saisie d'une partition de musique avec
paroles en tch?que, que je voudrais traduire en phon?tique. Autant dire
que je n'ai pas absolument *besoin* d'apprendre le Perl pour ?a, et que
donc j'aurais volontiers utilis? une recette de cuisine que quelqu'un
aurait pu me donner (ou que j'aurais trouv?e sur le net), m?me sans
tout comprendre.

> Pour le reste, oui bien sur que tu peux mettre plusieurs -e.


J'ai essay?, sans succ?s.

perl -p -e 's/foo/bar/g'
-> ok

perl -p -e 's/foo/bar/g' -e 's/qux/baz/g'
-> syntax error at -e line 2, near "s/qux/baz/g"

> Et perlrun te documente exactement ce que fait -i.bak


Et il confirme ce que je t'ai d?j? r?pondu, ? savoir que je ne dois
surtout pas l'utiliser.

> [...]
> Bon, t'as trouve une solution "manuelle" dans vim, pourquoi pas ?


Et j'en suis heureux, puisque je ne sais toujours pas comment le faire
avec Perl.

************************************************** *******************

Bon. Je suis un imb?cile, c'est entendu. Je ne sais pas lire la doc
de Perl, c'est ?vident. Mais toi qui sais, plut?t que de m'engueuler,
est-ce que tu pourrais me donner la syntaxe pour un programme nomm?
par exemple convert.pl, de telle fa?on que si je fais :
echo 'truc foo bidule foo chose qux et foo machin' | convert.pl
cela me r?ponde :
truc bar bidule bar chose baz et bar machin
?
Francois Lafont (08/10/2018, 23h22)
Bonjour,

On 10/08/2018 10:54 PM, Olivier Miakinen wrote:

> est-ce que tu pourrais me donner la syntaxe pour un programme nommé
> par exemple convert.pl, de telle façon que si je fais :
> echo 'truc foo bidule foo chose qux et foo machin' | convert.pl
> cela me réponde :
> truc bar bidule bar chose baz et bar machin
> ?


Attention, c'est une proposition qui répond à la question mais sache je
suis vraiment nul en Perl. Alors peut-être que ce n'est pas la bonne
façon de faire (auquel cas, je suis intéressé de connaître d'autres méthodes) :

------------------------------------------------------
~$ cat /tmp/convert.pl
#!/usr/bin/env perl

use strict;
use warnings;
use 5.026;

while (<>) {
$_ =~ s/a/X/g;
$_ =~ s/e/Y/g;
print $_;
}

~$ echo 'Salut tout le monde, ça va bien ?' | /tmp/convert.pl
SXlut tout lY mondY, çX vX biYn ?
------------------------------------------------------

Testé sous Ubuntu 18.04 avec Perl version 5.26.1. J'espère que ça t'aidera
à démarrer.

À+
Olivier Miakinen (09/10/2018, 00h16)
Bonjour François,

Le 08/10/2018 23:22, Francois Lafont a écrit :
> Attention, c'est une proposition qui répond à la question mais sache je
> suis vraiment nul en Perl. Alors peut-être que ce n'est pas la bonne
> façon de faire (auquel cas, je suis intéressé de connaître d'autres méthodes) :
> [...]


Merci merci merci !

Grâce à ton exemple, j'ai réussi à faire ce que je voulais.

Pas immédiatement, car il a fallu que je fasse accepter à mon programme
l'UTF-8 dans le script, en sortie et en entrée (respectivement use utf8;
puis binmode avec STDOUT et STDIN), mais ça marche ! Voici donc mon
tout premier programme Perl :

-----------------------------------------------------------------------
#!/usr/bin/env perl

use strict;
use warnings;
use 5.026;
use utf8; # UTF-8 dans le programme

=begin alphabet

Toutes les lettres tchèques
aábc?d?eé?fghiíjklmn?oópqr?s?t?uú?vwxyýz?

Voyelles
aáeé?iíoóuú?yý

Consonnes et semi-voyelles
bc?d?fghjklmn?pqr?s?t?vwxz?

=cut

binmode(STDOUT, ":utf8"); # sortie en UTF-8
binmode(STDIN, ":encoding(utf8)"); # s'assure que l'entrée est en UTF-8

while (<>) {
# On passe tout en minuscules
$_ =~ s/(.*)/\L$1/;

# consonne + (l ou r) + autre chose qu'une voyelle -> on ajoute un
schwa ?
$_ =~
s/([bc?d?fghjklmn?pqr?s?t?vwxz?])([lr])([^aáeé?iíoóuú?yý]|$)/$1?$2$3/g;

# ? en finale donne ?, sinon donne ?
$_ =~ s/?([^aábc?d?eé?fghiíjklmn?oópqr?s?t?uú?vwxyýz?]|$)/?$1/g;
$_ =~ s/?/?/g;

# autres substitutions - voyelles
$_ =~ s/á/a?/g;
$_ =~ s/e/?/g;
$_ =~ s/é/??/g;
$_ =~ s/?/j?/g;
$_ =~ s/[iy]/?/g;
$_ =~ s/[íý]/i?/g;
$_ =~ s/o/?/g;
$_ =~ s/ó/??/g;
$_ =~ s/u/?/g;
$_ =~ s/[ú?]/u?/g;

# autres substitutions - consonnes
$_ =~ s/x/ks/g;
$_ =~ s/ch/x/g;
$_ =~ s/c/ts/g;
$_ =~ s/?/t?/g;
$_ =~ s/?/dj/g;
$_ =~ s/h/?/g;
$_ =~ s/?/?/g;
$_ =~ s/q/kv/g;
$_ =~ s/?/r?/g;
$_ =~ s/?/?/g;
$_ =~ s/?/tj/g;
$_ =~ s/w/v/g;

print $_;
}
-----------------------------------------------------------------------

À partir de là je vais pouvoir simplifier un peu l'écriture en utilisant
les assertions dans les regexp, et des variables pour les voyelles et
les consonnes. En tout cas, merci de m'avoir mis le pied à l'étrier !
Olivier Miakinen (09/10/2018, 01h07)
Le 09/10/2018 00:16, je répondais à François Lafont :
> [...]
> À partir de là je vais pouvoir simplifier un peu l'écriture en utilisant
> les assertions dans les regexp, et des variables pour les voyelles et
> les consonnes.


Eh bien c'est fait. J'ai même simplifié plus que ce que je ne
l'imaginais, en supprimant tous les « $_ » sauf un, et en
n'ayant plus aucun $1 dans mes substitutions.

================================================== ======================
#!/usr/bin/env perl

use strict;
use warnings;
use 5.026;

use utf8; # UTF-8 dans le programme
binmode(STDOUT, ":utf8"); # sortie en UTF-8
binmode(STDIN, ":encoding(utf8)"); # s'assure que l'entrée est en UTF-8

# Toutes les lettres tchèques
my $lettre = "[aábc?d?eé?fghiíjklmn?oópqr?s?t?uú?vwxyýz?]";

# Voyelles
my $voyelle = "[aáeé?iíoóuú?yý]";

# Consonnes et semi-voyelles
my $consonne = "[bc?d?fghjklmn?pqr?s?t?vwxz?]";

while (<>) {
# On passe tout en minuscules
$_ = lc();

# l ou r précédé d'une consonne et non suivi d'une
# voyelle -> on ajoute un schwa ?
s/(?<=$consonne)(?=[lr](?!$voyelle))/?/g;

# ? en finale donne ?, sinon donne ?
s/?(?!$lettre)/?/g;
s/?/?/g;

# autres substitutions - voyelles
s/á/a?/g;
s/e/?/g;
s/é/??/g;
s/?/j?/g;
s/[iy]/?/g;
s/[íý]/i?/g;
s/o/?/g;
s/ó/??/g;
s/u/?/g;
s/[ú?]/u?/g;

# autres substitutions - consonnes
s/x/ks/g;
s/ch/x/g;
s/c/ts/g;
s/?/t?/g;
s/?/dj/g;
s/h/?/g;
s/?/?/g;
s/q/kv/g;
s/?/r?/g;
s/?/?/g;
s/?/tj/g;
s/w/v/g;

print;
}
================================================== ======================

Encore merci !
Benoit Izac (09/10/2018, 07h33)
Bonjour,

Le 08/10/2018 à 22:54, Olivier Miakinen a écrit dans le message
<ppgg60$1q8g$1> :

> perl -p -e 's/foo/bar/g'
> -> ok
> perl -p -e 's/foo/bar/g' -e 's/qux/baz/g'
> -> syntax error at -e line 2, near "s/qux/baz/g"


Il manque un « ; » pour séparer les deux instructions. C'est la même
chose que :
perl -p -e 's/foo/bar/g
s/qux/baz/g'

Donc :
perl -p -e 's/foo/bar/g;' -e 's/qux/baz/g'
ou plus simplement :
perl -p -e 's/foo/bar/g; s/qux/baz/g'
Marc Espie (09/10/2018, 12h25)
In article <ppgg60$1q8g$1>,
Olivier Miakinen <om+news> wrote:
>perl -p -e 's/foo/bar/g' -e 's/qux/baz/g'
>-> syntax error at -e line 2, near "s/qux/baz/g"


Si t'en mets plusieurs, il faut les ; de fin.
>perl -p -e 's/foo/bar/g'

=>
while (<>) {
s/foo/bar/g
}

(ca passe parce qu'accolade)

Donc: perl -p -e 's/foo/bar/g;' -e 's/qux/baz/g;'

>> Et perlrun te documente exactement ce que fait -i.bak

>Et il confirme ce que je t'ai déjà répondu, à savoir que je ne dois
>surtout pas l'utiliser.


Mais aussi te montre ce pour quoi c'est un raccourci, donc te donne
tout ce qu'il faut pour ecrire le code correspondant a ton cas
d'utilisation.

>Et j'en suis heureux, puisque je ne sais toujours pas comment le faire
>avec Perl.
>************************************************* ********************
>Bon. Je suis un imbécile, c'est entendu. Je ne sais pas lire la doc
>de Perl, c'est évident. Mais toi qui sais, plutôt que de m'engueuler,
>est-ce que tu pourrais me donner la syntaxe pour un programme nommé
>par exemple convert.pl, de telle façon que si je fais :
> echo 'truc foo bidule foo chose qux et foo machin' | convert.pl
>cela me réponde :
> truc bar bidule bar chose baz et bar machin
>?

Confere supra
Olivier Miakinen (09/10/2018, 15h22)
Le 09/10/2018 07:33, Benoit Izac m'a répondu :
> Il manque un « ; » pour séparer les deux instructions. C'est la même
> chose que :
> perl -p -e 's/foo/bar/g
> s/qux/baz/g'
> Donc :
> perl -p -e 's/foo/bar/g;' -e 's/qux/baz/g'


C'est pour ça que je n'y étais pas arrivé. Pourtant j'avais vraiment
cherché assez longtemps avant de venir poser ma question ici, et je
n'avais pas trouvé d'exemple avec deux -e de suite.

Donc j'aurais pu écrire :

perl -p \
...
-e 's/á/a?/g;' \
-e 's/e/?/g;' \
-e 's/é/??/g;' \
-e 's/?/j?/g;' \
-e 's/[iy]/?/g;' \
-e 's/[íý]/i?/g;' \
-e 's/o/?/g;' \
-e 's/ó/??/g;' \
-e 's/u/?/g;' \
-e 's/[ú?]/u?/g;' \
...

> ou plus simplement :
> perl -p -e 's/foo/bar/g; s/qux/baz/g'


D'accord. Mais quitte à avoir tout le programme en une seule fois,
je préfère la solution de François Lafont qui m'a vraiment bien
aidé.

Cela dit, merci pour l'info concernant les points-virgules. Ce qui est
rigolo, c'est que les trois écritures suivantes fonctionnent :
perl -p -e 's/foo/bar/g;' -e 's/qux/baz/g'
perl -p -e 's/foo/bar/g' -e ';s/qux/baz/g'
perl -p -e 's/foo/bar/g' -e ';' -e 's/qux/baz/g'
mais surtout que l'écriture suivante ne fait pas d'erreur, même si
elle semble ajouter un saut de ligne entre deux expressions.
perl -p -e 's/foo/b' -e 'ar/g;s/q' -e '?ux/baz/g'

Résultat sur la chaîne XXXfooYYYquxZZZ de la dernière expression :
XXXb
arYYYbazZZZ
Olivier Miakinen (09/10/2018, 15h24)
Le 09/10/2018 12:25, Marc Espie m'a répondu :
>>perl -p -e 's/foo/bar/g' -e 's/qux/baz/g'
>>-> syntax error at -e line 2, near "s/qux/baz/g"

> Si t'en mets plusieurs, il faut les ; de fin.


Ok, c'est ça que je ne savais pas. Voir aussi ma réponse à Benoit
Izac sur le truc amusant que j'ai découvert à ce propos.

> [...]
> Confere supra


Merci de ton aide.

Cordialement,
Olivier Miakinen (09/10/2018, 15h30)
Le 04/10/2018 14:52, Marc Espie avait écrit :
> perl -pi.bak -e 's/E/e/g;'


En relisant ton article de la semaine dernière, je vois que
tu avais mis un point-virgule dans cet exemple.

Il est juste dommage que tu n'aies pas écrit dès ce moment :
perl -pi.bak -e 's/E/e/g;' -e 's/A/a/g;'

En effet ça nous aurait évité une discussion houleuse puisque
je serais parti de cet exemple pour fabriquer le mien petit
à petit (de la même manière que ce que j'ai fait à partir
de l'exemple de François).

Mais bon, tu ne pouvais pas savoir que j'en étais à un tel
degré zéro de connaissance de Perl.

Sans rancune ?
Olivier Miakinen (09/10/2018, 15h42)
Le 09/10/2018 15:22, je répondais à Benoit Izac :
> C'est pour ça que je n'y étais pas arrivé. Pourtant j'avais vraiment
> cherché assez longtemps avant de venir poser ma question ici, et je
> n'avais pas trouvé d'exemple avec deux -e de suite.


Et bien évidemment, maintenant que j'ai la réponse, je sais trouver
des exemples dur le net qui donnent cette même réponse. Par exemple
ici :
<https://stackoverflow.com/questions/10424113/perl-command-line-search-and-replace-with-multiple-expressions>

:-)
Olivier Miakinen (09/10/2018, 15h43)
[Supersedes]

Le 09/10/2018 15:22, je répondais à Benoit Izac :
> C'est pour ça que je n'y étais pas arrivé. Pourtant j'avais vraiment
> cherché assez longtemps avant de venir poser ma question ici, et je
> n'avais pas trouvé d'exemple avec deux -e de suite.


Et bien évidemment, maintenant que j'ai la réponse, je sais trouver
des exemples sur le net qui donnent cette même réponse. Par exemple
ici :
<https://stackoverflow.com/questions/10424113/perl-command-line-search-and-replace-with-multiple-expressions>

:-)

Discussions similaires
Plusieurs conditions (if) successives en VBA ?

Comment lancer plusieurs fois un script php a partir d'un script php ?

comment écrire un script.

comment mettre plusieurs musiques successives sur un diaporama ?


Fuseau horaire GMT +2. Il est actuellement 19h25. | Privacy Policy