Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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}`

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,

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 ?


-- 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é

kamaris a écrit :

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.

kamaris a écrit :

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é

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é 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é

MicP a écrit :

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... wink
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é

FalCT60 a écrit :
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é 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.

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. lol
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é

FalCT60 a écrit :

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")
FalCT60 a écrit :

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.

https://www.gnu.org/software/coreutils/manual/html_node/cut-invocation.html a écrit :

‘-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