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

=c3

15 réponses
Avatar
Olivier Miakinen
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,
--
Olivier Miakinen

10 réponses

1 2
Avatar
espie
In article <pp138m$2dpf$,
Olivier Miakinen <om+ wrote:
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,

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
Avatar
Olivier Miakinen
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ə23/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é.
--
Olivier Miakinen
Avatar
espie
In article <pp5ron$1n3p$,
Olivier Miakinen <om+ 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:
https://perldoc.perl.org/perlrun.html
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 ?
Avatar
Olivier Miakinen
Le 08/10/2018 21:07, Marc Espie a écrit :
In article <pp5ron$1n3p$,
Olivier Miakinen <om+ 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:
https://perldoc.perl.org/perlrun.html
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
?
--
Olivier Miakinen
Avatar
Francois Lafont
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.
À+
--
François Lafont
Avatar
Olivier Miakinen
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 !
--
Olivier Miakinen
Avatar
Benoit Izac
Bonjour,
Le 08/10/2018 à 22:54, Olivier Miakinen a écrit dans le message
<ppgg60$1q8g$ :
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'
--
Benoit Izac
Avatar
espie
In article <ppgg60$1q8g$,
Olivier Miakinen <om+ 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.
[...]
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
?

Confere supra
Avatar
Olivier Miakinen
Le 09/10/2018 07:33, Benoit Izac 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"

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
Avatar
Olivier Miakinen
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
1 2