OVH Cloud OVH Cloud

[debutant] question sur sed

10 réponses
Avatar
julien.gautier
Bonjour,


comment faire avec sed pour obtenir ce genre de substitution :


chaine origine chaine retournée

ee'sr ee\'\'s'r

J'ai réussi à fabriquer cela, qui semble fonctionner (mais toute
remarque est la bienvenue : je suis très débutant) :

echo "ee'sr" | sed -e "s/'s/\\\'\\\'s'/g"

Mais j'aimerais que cela marche pour "'[a-z]" :

chaine origine chaine retournée

ee'ar ee\'\'a'r
ee'br ee\'\'b'r
ee'cr ee\'\'c'r

etc.

Merci d'avance pour vos suggestions.

10 réponses

Avatar
Stephane Chazelas
2004-07-9, 14:09(+02), Julien Gautier:
comment faire avec sed pour obtenir ce genre de substitution :

chaine origine chaine retournée

ee'sr ee''s'r


sed "s/'./\'\&'/g"

--
Stephane

Avatar
Stephane Chazelas
2004-07-09, 12:24(+00), Stephane Chazelas:
2004-07-9, 14:09(+02), Julien Gautier:
comment faire avec sed pour obtenir ce genre de substitution :

chaine origine chaine retournée

ee'sr ee''s'r


sed "s/'./\'\&'/g"
(pour n'importe quel caractere apres ')


sed "s/'[a-z]/\'\&'/g"

(pour seulement a-z).

--
Stephane


Avatar
julien.gautier
Stephane Chazelas wrote:

2004-07-09, 12:24(+00), Stephane Chazelas:
2004-07-9, 14:09(+02), Julien Gautier:
comment faire avec sed pour obtenir ce genre de substitution :

chaine origine chaine retournée

ee'sr ee''s'r


sed "s/'./\'\&'/g"
(pour n'importe quel caractere apres ')


sed "s/'[a-z]/\'\&'/g"

(pour seulement a-z).



que c'est beau !!!

merci beaucoup Stéphane.



Avatar
julien.gautier
Stephane Chazelas wrote:


sed "s/'./\'\&'/g"
(pour n'importe quel caractere apres ')


sed "s/'[a-z]/\'\&'/g"

(pour seulement a-z).



puis-je ajouter une seconde question ?


J'ai aussi des problèmes avec les accents (évidemment) ...


De plus je jongle entre AppleScript et le shell (puisque les commandes
shell ne sont lancées que par AppleScript : do shell script "commande"),
ce qui ne simplifie rien.


Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201

etc.


Or je n'arrive pas à écrire une commande sed qui transforme le "é" en
"e/314/201" et qui puisse se lancer depuis un fichier script, du genre :


---------- fichier_script ---------


#!/bin/bash


------ fin du fichier_script


Puis on lance :

echo $1 | sed -e la_commande_qui_va_bien

var=`cat fichier_texte` -- retourne la chaine "imbécile"

sh fichier_script var -- devrait retourner "imbe314201cile"


As-tu le courage (et le temps) de m'aider encore ?


Avatar
Stephane Chazelas
2004-07-9, 17:31(+02), Julien Gautier:
[...]
Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201
[...]


Autrement dit UTF-8 dans la forme canonique decomposee. Tu peux
utiliser perl 5.8, laisse tomber sed et le shell.

$ PERLIO=:utf8 perl -MUnicode::Normalize -MEncode -le '
print NFD(decode("latin1","é"))' | od -tc
0000000 e 314 201 n
0000004

--
Stephane

Avatar
julien.gautier
Stephane Chazelas wrote:

2004-07-9, 17:31(+02), Julien Gautier:
[...]
Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201
[...]


Autrement dit UTF-8 dans la forme canonique decomposee. Tu peux
utiliser perl 5.8, laisse tomber sed et le shell.

$ PERLIO=:utf8 perl -MUnicode::Normalize -MEncode -le '
print NFD(decode("latin1","é"))' | od -tc
0000000 e 314 201 n
0000004



excuse moi mais je suis complétement perdu.... je ne connais rien du
tout à Perl (par contre php, un peu oui).

comment dois-je utiliser ce bout de code ? dans un fichier ?

et si je veux ensuite décliner pour traiter tous les accents
possibles ?

merci encore.


Avatar
Sylvain
Julien Gautier a écrit le Friday 09 July 2004 17:31 :

Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201

etc.

Bonjour,


Je pense plutôt que ton problème vient du fait que tes locales ne
conviennent pas avec ceux de ton filesystem.
Plutôt que chercher des bidouilles pour faire ceci, tu devrais mettre
tes locale en "ce que tu veux UTF-8", et tu pourras faire tes accents sans
avoir a faire des choses comme e314201, après la méthode pour procéder
dépends de l'os que tu utilise.

--
Combien de jeunes talents confinés dans une mansarde s'étiolent et
périssent faute d'un ami.
BALZAC, Peau chagr., 1831, p. 12

GnuPG Fp : 052D6BA234FF6A39150B 3EB8BC841785FA5D5C97

Avatar
julien.gautier
Sylvain wrote:

Julien Gautier a écrit le Friday 09 July 2004 17:31 :

Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201

etc.

Bonjour,


Je pense plutôt que ton problème vient du fait que tes locales ne
conviennent pas avec ceux de ton filesystem.
Plutôt que chercher des bidouilles pour faire ceci, tu devrais mettre
tes locale en "ce que tu veux UTF-8", et tu pourras faire tes accents sans
avoir a faire des choses comme e314201, après la méthode pour procéder
dépends de l'os que tu utilise.


ok, merci.


Avatar
Stephane Chazelas
2004-07-11, 15:11(+02), Sylvain:
Julien Gautier a écrit le Friday 09 July 2004 17:31 :

Mon problème est le suivant : je veux pouvoir lancer un "cp" avec le bon
path vers le fichier; mais si le nom de ce fichier comporte des accents,
il faut les traduire aisni :

é ---> e314201

etc.

Je pense plutôt que ton problème vient du fait que tes locales ne

conviennent pas avec ceux de ton filesystem.


Ca y ressemble. Cela dit, je ne connais pas de locale sur aucun
systeme ou la frappe de la touche "é" insere les deux caracteres
Unicode e (U+0065) et "COMBINING_ACUTE_ACCENT" (U+0301). Je ne
l'ai toujours vu inseré que dans sa forme en un seul caractère
(U+00E9, (303251 en UTF8)).

Cela dit, il y a peut-etre moyen de monter le filesystem pour
que les caracteres soient convertis a la volee en
iso-8859-(1/15).


Avatar
julien.gautier
Stephane Chazelas wrote:

chaine origine chaine retournée

ee'sr ee''s'r


sed "s/'./\'\&'/g"
(pour n'importe quel caractere apres ')


sed "s/'[a-z]/\'\&'/g"

(pour seulement a-z).



Excuse moi d'y revenir mais je n'arrive pas à ajouter le traitement des
accents à la commande (y compris majuscules) :

sed "s/'[a-z]/\'\&'/g"

Sachant que ce sed s'éxécutera dans un shell sh (ou bash : MacOS X)