Jeu de caractères dans la commande rename
Fermé
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
-
17 févr. 2016 à 14:47
nolyann Messages postés 11 Date d'inscription mardi 8 septembre 2015 Statut Membre Dernière intervention 24 février 2016 - 24 févr. 2016 à 10:07
nolyann Messages postés 11 Date d'inscription mardi 8 septembre 2015 Statut Membre Dernière intervention 24 février 2016 - 24 févr. 2016 à 10:07
A voir également:
- Jeu de caractères dans la commande rename
- Invite de commande - Guide
- Caractères ascii - Guide
- 94 jeu - Télécharger - Puzzle & Réflexion
- Commande terminal mac - Guide
- Caractères spéciaux clavier azerty - Guide
7 réponses
Salut,
Parce que quand tu écris
Pour un remplacement, c'est y et non s qu'il faut employer et en mettant toutes les correspondances :
Parce que quand tu écris
"s/[ie]/a/g"c'est le i ou le e indifféremment qui sont remplacés par le caractère a et ça autant de fois que nécessaire (présence du g en fin de syntaxe).
Pour un remplacement, c'est y et non s qu'il faut employer et en mettant toutes les correspondances :
$ echo 'éèêëîïôöù' | sed 'y/éèêëîïôöù/eeeeiioou/'
eeeeiioou
$ echo "l'été sera bientôt là." | sed 'y/éèêëîïôöà/eeeeiiooa/'
l'ete sera bientot la.
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
17 févr. 2016 à 18:02
17 févr. 2016 à 18:02
Salut,
Merci pour ta réponse mais je crois que tu as mal compris ma question.
Dans mes trois exemples, je suis d'accord avec les deux derniers. Mais je ne comprends pas pourquoi dans le premier j'obtiens titiee et non pas titie. L'interprétation de la commande est "si on rencontre un é ou un è, le substituer par un e" et non pas deux...
Merci pour ta réponse mais je crois que tu as mal compris ma question.
Dans mes trois exemples, je suis d'accord avec les deux derniers. Mais je ne comprends pas pourquoi dans le premier j'obtiens titiee et non pas titie. L'interprétation de la commande est "si on rencontre un é ou un è, le substituer par un e" et non pas deux...
Oups effectivement j'avais mal lu l'énoncé ;-(
Par contre il semblerait que ce soit un bug du programme, qui à la base n'est peut-être pas conçu pour l'alphabet français et ses caractères accentués ;-\
En reprenant ton exemple, et en essayant de renommer un fichier ne contenant pas la lettre voulue, voilà ce qui se passe :
Une substitution à lieu quand même et apparaît un caractère (non pris en charge (▒)) à la suite ;-\
Je pense que c'est aussi un problème d'encodage. Perso je suis en
Voilà ce que donne ce caractère en le passant à unum :
http://www.fileformat.info/info/unicode/char/2592/index.htm
Par contre il semblerait que ce soit un bug du programme, qui à la base n'est peut-être pas conçu pour l'alphabet français et ses caractères accentués ;-\
En reprenant ton exemple, et en essayant de renommer un fichier ne contenant pas la lettre voulue, voilà ce qui se passe :
$ ls -1
titié
titié.txt
$ rename -n 's/[è]/e/g' *
titié renamed as titie▒
titié.txt renamed as titie▒.txt
Une substitution à lieu quand même et apparaît un caractère (non pris en charge (▒)) à la suite ;-\
Je pense que c'est aussi un problème d'encodage. Perso je suis en
fr_FR.UTF-8.
Voilà ce que donne ce caractère en le passant à unum :
$ ../unum.pl '▒'
Octal Decimal Hex HTML Character Unicode
022622 9618 0x2592 ▒ "▒" MEDIUM SHADE
http://www.fileformat.info/info/unicode/char/2592/index.htm
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
22 févr. 2016 à 19:36
22 févr. 2016 à 19:36
Salut,
Désolé pour mon silence durant 4 jours.
En fait il semble que le problème existe uniquement quand le caractère à substituer est d'une part accentué et d'autre part entre crochets, même seul. Mes exemples 2 et 3 montrent que ça fonctionne en dehors de ces deux conditions. Personnellement je suis en UTF8 aussi mais en anglais. Question au passage: comment fais-tu pour connaître l'encodage? Y a-t-il une commande?
En fait j'utilise la commande rename dans un script et je voulais cumuler les caractères accentués comme ceci:
Je devrai donc les écrire dans un appel à rename séparé, ce qui va pas mal ralentir mon script. Tant pis.
Désolé pour mon silence durant 4 jours.
En fait il semble que le problème existe uniquement quand le caractère à substituer est d'une part accentué et d'autre part entre crochets, même seul. Mes exemples 2 et 3 montrent que ça fonctionne en dehors de ces deux conditions. Personnellement je suis en UTF8 aussi mais en anglais. Question au passage: comment fais-tu pour connaître l'encodage? Y a-t-il une commande?
En fait j'utilise la commande rename dans un script et je voulais cumuler les caractères accentués comme ceci:
rename -v "s/[áàâäãÁÀÂÄÃ]/a/g" *
rename -v "s/[éèêëẽÉÈÊËẼ]/e/g" *
rename -v "s/[íìîïĩÍÌÎÏĨ]/i/g" *
rename -v "s/[óòôöõÓÒÔÖÕ]/o/g" *
rename -v "s/[úùûüũÚÙÛÜŨ]/u/g" *
Je devrai donc les écrire dans un appel à rename séparé, ce qui va pas mal ralentir mon script. Tant pis.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
23 févr. 2016 à 09:22
23 févr. 2016 à 09:22
Je pense que le problème vient de l'UTF-8 qui encode sur 2 octets ;-\
Sinon avec utrac :
Question au passage: comment fais-tu pour connaître l'encodage? Y a-t-il une commande?Avec la commande
locale:
$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
Sinon avec utrac :
$ utrac -d
Language: French
System: Unix
Output charset: UTF-8
Output EOL: LF
Error character: '_'
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 622
23 févr. 2016 à 09:31
23 févr. 2016 à 09:31
hello
1 caractère à la fois, ça passe
1 caractère à la fois, ça passe
$ ls
aéè titié èèè
$ rename -nv 's/é/e/g;s/è/e/g' *
aéè renamed as aee
titié renamed as titie
èèè renamed as eee
$ rename -nv 's/[éè]/e/g' *
aéè renamed as aeeee
titié renamed as titiee
èèè renamed as eeeeee
$
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
23 févr. 2016 à 09:48
23 févr. 2016 à 09:48
Je ne savais pas qu'on pouvais cumuler des expressions de sed dans rename. Ainsi mon script sera quand-même un peu plus rapide.
Merci à tous pour vos réponses.
Merci à tous pour vos réponses.
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 622
Modifié par dubcek le 23/02/2016 à 10:10
Modifié par dubcek le 23/02/2016 à 10:10
essayer ça pour tous les accents
test
$ C1="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ"
$ C2="AAAAAAACEEEEIIIIDNOOOOOOUUUUYPSaaaaaaaceeeeiiiionoooooouuuuyby"
$ C3="$(for((i=0; i<${#C1}; i++)); do echo -n "s/${C1:$i:1}/${C2:$i:1}/g;"; done)"
$ rename -nv "$C3" *
test
$ touch $C1
$ ls
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
$ rename -nv "$C3" *
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ renamed as AAAAAAACEEEEIIIIDNOOOOOOUUUUYPSaaaaaaaceeeeiiiionoooooouuuuyby
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
24 févr. 2016 à 10:07
24 févr. 2016 à 10:07
Ouahhh! Très compact ton script. Un bel exemple de manipulation des chaînes de caractères sous Bash!
Je vais m'en inspirer. Merci.
Je vais m'en inspirer. Merci.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
23 févr. 2016 à 14:21
23 févr. 2016 à 14:21
Re-
Je confirme que c'est un problème d'encodage UTF-8.
Sur une VM avec Debian 8 en UTF-8 j'ai reconfiguré les locales :
en
Je confirme que c'est un problème d'encodage UTF-8.
Sur une VM avec Debian 8 en UTF-8 j'ai reconfiguré les locales :
sudo dpkg-reconfigure locales
en
fr_FR@euro, redémarré la session et refait des tests :
jp@debian8:~/trash$ locale
LANG=fr_FR@euro
LANGUAGE=
LC_CTYPE="fr_FR@euro"
LC_NUMERIC="fr_FR@euro"
LC_TIME="fr_FR@euro"
LC_COLLATE="fr_FR@euro"
LC_MONETARY="fr_FR@euro"
LC_MESSAGES="fr_FR@euro"
LC_PAPER="fr_FR@euro"
LC_NAME="fr_FR@euro"
LC_ADDRESS="fr_FR@euro"
LC_TELEPHONE="fr_FR@euro"
LC_MEASUREMENT="fr_FR@euro"
LC_IDENTIFICATION="fr_FR@euro"
LC_ALL=
jp@debian8:~/trash$ touch tétè
jp@debian8:~/trash$ ls
tétè
jp@debian8:~/trash$ rename -n -v 'y/[éè]/e/' t*
rename(tétè, tete)
jp@debian8:~/trash$ touch tétètàtôtù
jp@debian8:~/trash$ ls
tétè tétètàtôtù
jp@debian8:~/trash$ rename -n -v 'y/éèàôù/eeaou/' t*
rename(tétè, tete)
rename(tétètàtôtù, tetetatotu)
nolyann
Messages postés
11
Date d'inscription
mardi 8 septembre 2015
Statut
Membre
Dernière intervention
24 février 2016
Modifié par nolyann le 24/02/2016 à 10:02
Modifié par nolyann le 24/02/2016 à 10:02
Merci zipe31,
Je préssentais que l'encodage était en cause, mais je n'en étais pas sûr.
Mais je vais quand-même conserver le mien.
Je préssentais que l'encodage était en cause, mais je n'en étais pas sûr.
Mais je vais quand-même conserver le mien.