OVH Cloud OVH Cloud

[sed] optimisation masque

6 réponses
Avatar
Christophe PEREZ
Bonjour,

J'ai (encore) une question bête, et une de fois de plus sur sed :-)

Je prends un exemple pour être sûr d'être compris, mais je ne veux pas de
solution alternative car ça peut s'appliquer ailleurs, et surtout, ça
n'aidera pas ma compréhension ;-)

Soit un mail, stocké dans un fichier.
Dans les entêtes de ce mail, je peux avoir une ligne du genre
Message-Id: <xxx_peu_importexxx@Valérie>

Or, je ne veux pas de caractère accentué dans le Message-Id.
Je fais donc un filtre pour ça, par exemple :
sed 's/^\(Message-Id: .*\)[éèêë]\(.*\)/\1e\2/g'

Seulement, je trouve l'expression bien lourde pour l'usage, et je me dis
qu'il doit y avoir mieux.
De plus, comment traiter toutes les voyelles concernées ?
Une expression par lettre de remplacement ?

Tant que j'y pense, une question que je me suis déjà posée :
Est-il possible de matcher plus de 9 valeurs différentes en une seule
expression ? Si oui, qu'utiliser après le \9 ?

Merci de vos éclairages.

PS : J'insiste bien, c'est surtout pour ma compréhension, en particulier
des regexp.

--
Christophe PEREZ

6 réponses

Avatar
Jean-Yves LENHOF
On Wed, 01 Oct 2003 11:00:30 -0400, Christophe PEREZ wrote:

Bonjour,

J'ai (encore) une question bête, et une de fois de plus sur sed :-)

Je prends un exemple pour être sûr d'être compris, mais je ne veux
pas de solution alternative car ça peut s'appliquer ailleurs, et
surtout, ça n'aidera pas ma compréhension ;-)

Soit un mail, stocké dans un fichier. Dans les entêtes de ce mail, je
peux avoir une ligne du genre Message-Id: érie>

Or, je ne veux pas de caractère accentué dans le Message-Id. Je fais
donc un filtre pour ça, par exemple : sed 's/^(Message-Id:
.*)[éèêë](.*)/1e2/g'


<snip>


cf le man de tr :

...
[NDT] Une utilisation pratique pour nous est la suppression des accents
d’un texte. En voici un exemple supprimant les accents
utilisés en français.
tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"

Quand tr effectue une traduction, jeu1 et jeu2 doivent
normalement avoir la même longueur. Si jeu1 est plus court que
jeu2, les caractères supplémentaires en fin de jeu2 sont
ignorés.
...

Cordialement,

JYL

Avatar
TiChou
Dans l'article news:,
Christophe PEREZ écrivait :

Bonjour,


Bonjour,

Soit un mail, stocké dans un fichier.
Dans les entêtes de ce mail, je peux avoir une ligne du genre
Message-Id: érie>

Or, je ne veux pas de caractère accentué dans le Message-Id.
Je fais donc un filtre pour ça, par exemple :
sed 's/^(Message-Id: .*)[éèêë](.*)/1e2/g'

Seulement, je trouve l'expression bien lourde pour l'usage, et je me
dis qu'il doit y avoir mieux.


Oui,

sed -e '/^Message-Id:[[:blank:]]/s/[éèêë]/e/g

De plus, comment traiter toutes les voyelles concernées ?
Une expression par lettre de remplacement ?


sed -e '/^Message-Id:[[:blank:]]/{
s/[àâä]/a/g
s/[éèêë]/e/g
s/[îï]/i/g
s/[ôö]/o/g
s/[ùûü]/u/g
}'

ou

sed -e '/^Message-Id:[[:blank:]]/y/àâäéèêëîïôöùûü/aaaeeeeiioouuu/'

[[:blank:]] extension GNU/POSIX, équivaut à [ t]

Tant que j'y pense, une question que je me suis déjà posée :
Est-il possible de matcher plus de 9 valeurs différentes en une seule
expression ?


Non.

--
TiChou

Avatar
Marc Lasson
Christophe PEREZ wrote:
Bonjour,
Salut,


Soit un mail, stocké dans un fichier.
Dans les entêtes de ce mail, je peux avoir une ligne du genre
Message-Id: érie>

Or, je ne veux pas de caractère accentué dans le Message-Id.
Je fais donc un filtre pour ça, par exemple :
sed 's/^(Message-Id: .*)[éèêë](.*)/1e2/g'


Attention, ce script ne fait ce que tu veux, il ne transforme qu'un seul
accent.

si tu as :
Message-Id: émé>
tu obtiendras en sortie:
Message-Id: éme>

Voir Mr TiChou pour les solutions kivontbien, 'y' sert précisement à ce
genre d'usage.

--
Marc.

Avatar
Laurent Wacrenier
Christophe PEREZ écrit:
Or, je ne veux pas de caractère accentué dans le Message-Id.
Je fais donc un filtre pour ça, par exemple :
sed 's/^(Message-Id: .*)[éèêë](.*)/1e2/g'

Seulement, je trouve l'expression bien lourde pour l'usage, et je me dis
qu'il doit y avoir mieux.


Tout à fait :

sed '/^Message-Id:/s/[éèêë]/e/g'

De plus, comment traiter toutes les voyelles concernées ?


/^Message-Id:/{s/[éèêë]/e/g;s/ÿ/y/g; ... ;}

Une expression par lettre de remplacement ?


Ben oui.

Tant que j'y pense, une question que je me suis déjà posée :
Est-il possible de matcher plus de 9 valeurs différentes en une seule
expression ? Si oui, qu'utiliser après le 9 ?


Pas d'après le manuel, donc non.

Avatar
Christophe PEREZ
Le Thu, 02 Oct 2003 05:47:33 +0200, TiChou a écrit :

sed -e '/^Message-Id:[[:blank:]]/s/[éèêë]/e/g


Ok.
Je crois que je viens d'apprendre une utilisation pourtant évidente de
sed.

sed -e '/^Message-Id:[[:blank:]]/{
s/[àâä]/a/g
s/[éèêë]/e/g
s/[îï]/i/g
s/[ôö]/o/g
s/[ùûü]/u/g
}'

ou

sed -e '/^Message-Id:[[:blank:]]/y/àâäéèêëîïôöùûü/aaaeeeeiioouuu/'

[[:blank:]] extension GNU/POSIX, équivaut à [ t]


Merci pour la précision qui, tu l'auras compris, m'est fort utile :-)

Est-il possible de matcher plus de 9 valeurs différentes en une seule
expression ?


Non.


Bien.

Merci bien pour ces infos, et merci beaucoup aussi aux autres
contributeurs que j'ai lus avec attention et dont j'ai bien pris en compte
tous les commentaires.

--
Christophe PEREZ


Avatar
Jean-Yves LENHOF
On Wed, 01 Oct 2003 11:00:30 -0400, Christophe PEREZ wrote:

Bonjour,

J'ai (encore) une question bête, et une de fois de plus sur sed :-)

Je prends un exemple pour être sûr d'être compris, mais je ne veux pas de
solution alternative car ça peut s'appliquer ailleurs, et surtout, ça
n'aidera pas ma compréhension ;-)

Soit un mail, stocké dans un fichier.
Dans les entêtes de ce mail, je peux avoir une ligne du genre
Message-Id: érie>

Or, je ne veux pas de caractère accentué dans le Message-Id.
Je fais donc un filtre pour ça, par exemple :
sed 's/^(Message-Id: .*)[éèêë](.*)/1e2/g'



<snip>

cf le man de tr :

...
[NDT] Une utilisation pratique pour nous est la suppression des accents
d’un texte. En voici un exemple supprimant les accents utilisés en
français.
tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"

Quand tr effectue une traduction, jeu1 et jeu2 doivent normalement
avoir la même longueur. Si jeu1 est plus court que jeu2, les caractères
supplémentaires en fin de jeu2 sont ignorés.


Cordialement,

JYL