#1 Le 11/12/2020, à 23:49
- FalCT60
[Résolu] Comptage de caractères erroné
Bonsoir,
Je sens que je vais encore me faire taper sur la tête... alors, pas trop fort, SVP, elle doit continuer de me servir encore quelques années...
J'ai codé un script qui me liste les Blu-Ray que j'ai transférés sur disque en me donnant l'année, le titre, la taille et quelques autres informations. Cela me sert à alimenter ma BD-Thèque au fur et à mesure.
Ce n'est certainement pas aussi optimisé que cela pourrait l'être, mais cela a le mérite de fonctionner. Enfin, presque...
Le titre complet en entrée est du style
2018 – Yǐng.iso
et l'on pourra remarquer qu'il contient au moins un caractère non ASCII standard
–
qui est commun à tous les titres.
Celui de l'exemple en comporte même un second
ǐ
Sachant qu'il peut y en avoir beaaaaaaaaucoup plus.
Tout se déroule à merveille, sauf que j'ai besoin d'éliminer les sept premiers caractères, et que pour ce faire j'utilise la commande
titre=`echo -e "$nom" | cut -c8-${#nom}`
où nom est la chaîne complète, et titre le résultat amputé des caractères du début jusqu'au second espace.
Et, là, au lieu d'obtenir
Yǐng.iso
j'ai droit à
YÇng.
et ce n'est pas du tout la même chose.
Je suis sur cette énigme depuis le début de la soirée, je ne sais plus à quels saints me vouer, là je vais me coucher avant que ma tête ne finisse par exploser - il ne restera plus rien sur quoi taper.
Toute piste sera bienvenue.
Merci d'avance.
Dernière modification par FalCT60 (Le 13/12/2020, à 22:00)
Hors ligne
#2 Le 12/12/2020, à 00:13
- kamaris
Re : [Résolu] Comptage de caractères erroné
cut prétend compter les caractères, mais ne compte en fait que les octets : https://www.gnu.org/software/coreutils/ … ation.html
Ceci dit, tu devrais de toutes façons faire autrement dans ce cas, par exemple (pour rester sur cut) :
titre=$(cut -d' ' -f3 <<<"$nom")
Dernière modification par kamaris (Le 12/12/2020, à 00:14)
Hors ligne
#3 Le 12/12/2020, à 00:45
- Watael
Re : [Résolu] Comptage de caractères erroné
$ nom='2018 – Yǐng.iso'
$ ar=( $nom )
$ echo "${ar[2]}"
Yǐng.iso
?
edit: correction coquille
Dernière modification par Watael (Le 12/12/2020, à 10:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 12/12/2020, à 09:31
- FrancisFDZ
Re : [Résolu] Comptage de caractères erroné
Bonjour,
$ nom='2018 – Yǐng.iso' $ ar=( $nom ) $ echo "${ar[2]}" Yîng.iso
?
"Yǐng.iso" = "Yîng.iso" ? La différence porte sur l'accent sur le "i" de "Ying", est-ce important significatif ?
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#5 Le 12/12/2020, à 10:45
- Watael
Re : [Résolu] Comptage de caractères erroné
c'est une faute de frappe à la recopie. je corrige.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 12/12/2020, à 17:26
- FalCT60
Re : [Résolu] Comptage de caractères erroné
cut prétend compter les caractères, mais ne compte en fait que les octets : https://www.gnu.org/software/coreutils/ … ation.html
D'accord, mais alors pourquoi
cap=`echo $nom | cut -c8`
me récupère bien le Y ?
Rectification : les tests ont été effectués sur des chaînes ne comportant aucun caractère exotique. De nouveaux tests sur des chaînes comportant de tels caractères prouvent que c'est bien le cut qui est en cause - bon à savoir.
Et, du coup, il faut que je modifie également mon test de début de titre (8 ème caractère de nom) - ou que je le fasse sur la variable titre, cela me semble plus judicieux.
Ceci dit, tu devrais de toutes façons faire autrement dans ce cas, par exemple (pour rester sur cut) :
titre=$(cut -d' ' -f3 <<<"$nom")
Oui, mais dans ce cas, si d'autres espaces sont présents dans la chaîne nom, ils sont également interprétés.
Je continue de creuser. Et je vais approfondir la page que tu m'as indiquée, mais à tête reposée parce que, là, sa lecture m'a plus embrouillé qu'autre chose.
Hors ligne
#7 Le 12/12/2020, à 17:36
- MicP
Re : [Résolu] Comptage de caractères erroné
Bonjour
… Oui, mais dans ce cas, si d'autres espaces sont présents dans la chaîne nom, ils sont également interprétés. …
On pourrait peut-être faire comme ça :
michel@ubuT450:~$ nom='2018 – Yǐng blabla.iso'
michel@ubuT450:~$ titre="${nom##* – }"
michel@ubuT450:~$ echo $titre
Yǐng blabla.iso
michel@ubuT450:~$
Dernière modification par MicP (Le 12/12/2020, à 17:45)
Hors ligne
#8 Le 12/12/2020, à 18:31
- FalCT60
Re : [Résolu] Comptage de caractères erroné
Bonjour,
Watael a écrit :$ nom='2018 – Yǐng.iso' $ ar=( $nom ) $ echo "${ar[2]}" Yîng.iso
?
"Yǐng.iso" = "Yîng.iso" ? La différence porte sur l'accent sur le "i" de "Ying", est-ce important significatif ?
Voilà, même punition que cut -d' ' : il me supprime tout ce qui débute par des espaces.
Mea culpa : l'exemple que j'ai donné était à la fois insuffisamment et trop représentatif. J'aurais dû prendre un titre comportant plus d'un mot, mais je dois avouer que j'avais le cerveau dans un état plus que déplorable, sur le moment.
Ceci étant, lorsque je dis que je continue de creuser : j'ai trouvé
titre=$(echo ${nom:7})
qui, si j'ai bien saisi, affiche tout ce qui suit le septième caractère (exclu).
Content de moi, du coup, j'ai voulu aller plus loin : en profiter pour supprimer également les 4 derniers caractères (.iso dans le cas présent, mais cela peut varier).
Et donc, après recherches, j'ai modifié en
titre=$(echo ${nom:7:$((${#nom}-5))})
qui devrait, sauf erreur, afficher tout ce qui se trouve à partir du huitième caractère du début, jusqu'au cinquième caractère de la fin.
Mais, à mon grand désarroi, le résultat est identique au précédent.
Je continue de creuser, mais j'avoue que, là, j'ai plutôt l'impression d'être arrivé sur du très dur.
Hors ligne
#9 Le 12/12/2020, à 18:34
- FalCT60
Re : [Résolu] Comptage de caractères erroné
Bonjour
… Oui, mais dans ce cas, si d'autres espaces sont présents dans la chaîne nom, ils sont également interprétés. …
On pourrait peut-être faire comme ça :
michel@ubuT450:~$ nom='2018 – Yǐng blabla.iso' michel@ubuT450:~$ titre="${nom##* – }" michel@ubuT450:~$ echo $titre Yǐng blabla.iso michel@ubuT450:~$
Merci, mais j'ai trouvé (lorsque je dis que je continue de creuser...
Ceci étant, il s'est écoulé un certain temps entre mes deux posts. Je suis plutôt lent.
Hors ligne
#10 Le 12/12/2020, à 18:43
- FalCT60
Re : [Résolu] Comptage de caractères erroné
FrancisFDZ a écrit :Bonjour,
Watael a écrit :$ nom='2018 – Yǐng.iso' $ ar=( $nom ) $ echo "${ar[2]}" Yîng.iso
?
"Yǐng.iso" = "Yîng.iso" ? La différence porte sur l'accent sur le "i" de "Ying", est-ce important significatif ?
Voilà, même punition que cut -d' ' : il me supprime tout ce qui débute par des espaces.
Mea culpa : l'exemple que j'ai donné était à la fois insuffisamment et trop représentatif. J'aurais dû prendre un titre comportant plus d'un mot, mais je dois avouer que j'avais le cerveau dans un état plus que déplorable, sur le moment.
Ceci étant, lorsque je dis que je continue de creuser : j'ai trouvétitre=$(echo ${nom:7})
qui, si j'ai bien saisi, affiche tout ce qui suit le septième caractère (exclu).
Content de moi, du coup, j'ai voulu aller plus loin : en profiter pour supprimer également les 4 derniers caractères (.iso dans le cas présent, mais cela peut varier).
Et donc, après recherches, j'ai modifié entitre=$(echo ${nom:7:$((${#nom}-5))})
qui devrait, sauf erreur, afficher tout ce qui se trouve à partir du huitième caractère du début, jusqu'au cinquième caractère de la fin.
Mais, à mon grand désarroi, le résultat est identique au précédent.
Je continue de creuser, mais j'avoue que, là, j'ai plutôt l'impression d'être arrivé sur du très dur.
Et je viens de trouver : la syntaxe correcte est
titre=$(echo ${nom:7:$((${#nom}-11))})
ce que je parviens à comprendre, mais néanmoins pas à détailler. Le temps que cela mûrisse dans mon pauvre cerveau bien ébranlé.
Hors ligne
#11 Le 12/12/2020, à 18:52
- Watael
Re : [Résolu] Comptage de caractères erroné
$ nom='2018 – Yǐng blabla.iso'
$ ar=( $nom )
$ echo ${ar[@]:2}
Yǐng blabla.iso
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 12/12/2020, à 20:35
- FalCT60
Re : [Résolu] Comptage de caractères erroné
Linux, ou les mille et une façon de parvenir au même résultat... extraordinaire, mais déroutant.
J'aurai découvert au moins trois façons de faire ce que je souhaite.
Juste une chose qui me trouble : j'ai fait une recherche, et man ar me renvoie sur les pages d'un archiveur. Et je ne parviens pas à comprendre le rapport.
Merci, en tout cas, à vous tous qui m'avez aidé.
Hors ligne
#13 Le 12/12/2020, à 21:28
- Watael
Re : [Résolu] Comptage de caractères erroné
ar est le nom ar(?*)bitraire d'une variable tableau shell.
--
* non.
ar -> array
aAr -> associative array
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 13/12/2020, à 01:22
- kamaris
Re : [Résolu] Comptage de caractères erroné
Oui, mais dans ce cas, si d'autres espaces sont présents dans la chaîne nom, ils sont également interprétés.
titre=$(cut -d' ' -f3- <<<"$nom")
Je continue de creuser. Et je vais approfondir la page que tu m'as indiquée, mais à tête reposée parce que, là, sa lecture m'a plus embrouillé qu'autre chose.
‘-c character-list’
‘--characters=character-list’Select for printing only the characters in positions listed in character-list. The same as -b for now, but internationalization will change that.
Hors ligne
#15 Le 13/12/2020, à 17:33
- LeoMajor
Re : [Résolu] Comptage de caractères erroné
bonjour,
si tu as besoin de nettoyer les noms de fichiers des caractères exotiques
:~$ inline-detox < <(iconv -f utf8 -t ascii//translit <<<"(2018) Père Noël|サンタクロース[@laponie(-30°C)/*FR/] – Yǐng.iso")
2018-Pere_Noel-laponie-30_C-FR-Ying.iso
apt/aptitude install detox
découpage
:~$ fichier=$(inline-detox < <(iconv -f utf8 -t ascii//translit <<<"(2018) Père Noël|サンタクロース[@laponie(-30°C)/*FR/] – Yǐng.iso"))
:~$ echo "$fichier"
2018-Pere_Noel-laponie-30_C-FR-Ying.iso
:~$ awk 'BEGIN {FS="[. -]"}; {print $NF,$(NF-1),$(NF-2)}' <<<"$fichier"
iso Ying FR
$NF est le dernier champs, puis avant-dernier ....
FS est le séparateur entre 2 champs
Hors ligne
#16 Le 13/12/2020, à 21:59
- FalCT60
Re : [Résolu] Comptage de caractères erroné
Cela fait beaucoup d'informations à utiliser en fonction des cas.
@ LeoMajor : non, surtout pas ! je tiens à conserver les noms tels qu'ils sont (et que je me suis fait suer à saisir).
Je clôture ce fil, grâce auquel j'ai encore appris.
Encore merci à tous.
Hors ligne