IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Debian 11] Tentative de transformation d'une grande chaine de caractères en tableau multi-lignes


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut [Debian 11] Tentative de transformation d'une grande chaine de caractères en tableau multi-lignes
    Bonjour,

    tout est dans le titre, alors je détaille : la grande chaine du titre vient de la récupération d'informations relatives aux polices de caractères, extraites en utilisant un binaire (à peine modifié par mes soins) venant de FontForge, je veux parler de showttf à qui j'ai rajouté la possibilité de sortir les données de la table "NAME".
    Ce qui est curieux c'est que les données, je les vois dans la console et j'aimerais bien les avoir sous forme de liste de chaines, comme je les vois (pour une fonte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    voilà donc 14 lignes ou plutôt, 7 groupes de deux) mais je n'y arrive pas : quand je demande la taille du tableau, ça me répond "1"...
    Et pourtant, il doit bien y avoir des n dans la liste, puisqu'on voit que les données sont correctement alignées à gauche.

    J'aimerais bien avoir un tableau qui me dise "14", parce que j'ai d'autres données à lui extraire.

    J'ai appelé mon tableau atab, et je le remplis ainsi, en utilisant la fonte Lucida Console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    atab=$(./showttfcustom -n /usr/share/fonts/AutresFontes/Machine/LUCON.TTF | grep -I -v Copyright | grep platform=1 -A1 | head -n 14)
    echo $atab
    platform=1 plat_spec_encoding=0 language=0 name=1 Family offset= 59 lenght= 14 Lucida Console platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily offset= 73 lenght= 7 Regular platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID offset= 80 lenght= 35 Lucida Console Regular; B&H alpha25 platform=1 plat_spec_encoding=0 language=0 name=4 FullName offset= 115 lenght= 14 Lucida Console platform=1 plat_spec_encoding=0 language=0 name=5 Version offset= 129 lenght= 12 Version 1.60 platform=1 plat_spec_encoding=0 language=0 name=6 Postscript offset= 141 lenght= 13 LucidaConsole platform=1 plat_spec_encoding=0 language=0 name=7 Trademark offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    Par ailleurs, j'ai trouvé ça, quelque part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    To read a whole line at once, use:
    IFS=""
    Alors j'ai testé, mais ça n'a rien changé, le tableau a toujours une taille de "1"...
    Une idée ?

    Grand merci par avance,

    Tout le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    OLDIFS=$IFS
    IFS=$'n'
    ou (voir texte)
    #IFS=""
    declare -a atab
     
    atab=$(while read -r f; do echo "$f"; done < <( (/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge/showttfcustom -n /usr/share/fonts/AutresFontes/Machine/LUCON.TTF | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) ))
    echo "${!atab[@]}" # "0"
    # doubles parenthèses obligatoires !
    for ((i=0; i<"${#atab[@]}"; i++)); do echo "$i"; echo "${atab[$i]}"; done # un seul 0
    IFS=$OLDIFS
    PS : ce post fait suite à celui du 6/8/24, magistralement géré par disedorgue : https://www.developpez.net/forums/d2.../#post12038076

    Et des infos relatives à FontForge et Showttf sont là : https://forum.lazarus.freepascal.org...7mc6#msg525854

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 278
    Points : 13 564
    Points
    13 564
    Par défaut
    Bonjour

    Et ben alors ? On parenthèse à tout va ? Es-tu au courant qu'en shell c'est un sous-processus ? On identifie deux choses : (ligne 8 de ton code)
    • Tu as mis ( ) (sous-processus) quand tu voulais mettre $( ) (substitution de commande).
    • Et tu as mis ( ) dans une substitution de processus, alors que tu n'as besoin ni de substitution de commande, ni de sous-processus.


    J'espère être clair.

    Et par suite, bash renvoie le résultat du sous-processus qui n'est qu'un code erreur, donc remplit ton tableau d'une seule donnée. N'est-ce pas ?

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 602
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 602
    Points : 19 511
    Points
    19 511
    Par défaut
    Bonjour,

    atab n'est pas un tableau.
    là, tu aurais un tableau.

    on ne modifie pas l'IFS globalement.

    admettons :

    je reproduis la sortie que tu veux traiter (si j'ai bien compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cmd() {
        echo 'platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.';}
    je mets la sortie, ligne par ligne, dans un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ mapfile -t cmdArray < <(cmd)
    j'affiche la totalité du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ printf '%s\n' "${cmdArray[@]}"
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    j'affiche le tableau deux lignes par deux lignes, séparées par une ligne vide (ce n'est que du formatage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ for ((n=0;n<${#cmdArray[*]};n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; echo; done
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
     
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
     
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
     
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
     
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
     
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
     
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Bonjour,

    je ne vous remercierai jamais assez !

    Vous m'avez ôté une épine du pied qui ressemblait à un javelot de sportif olympique, et en quelques lignes mon problème est résolu.
    MERCI !

    Voilà à quoi ça ressemble, maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    binaryPath="/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge"
    fonte="/usr/share/fonts/AutresFontes/Machine/LUCON.TTF"
    mapfile -t cmdArray < <($binaryPath/showttfcustom -n $fonte | grep -I -v Copyright | grep platform=1 -A1 | head -n 14)
    # 1 ligne de vérif 
    #printf '%s\n' "${cmdArray[@]}"
    #echo "suite"
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; echo; done # ligne d'origine
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; done
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}"; done # affiche les lignes platform
     for ((n=1; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}"; done # affiche les lignes offset
    echo ${#cmdArray[*]} # 14 
    echo ${#cmdArray[@]} # 14
    echo ${cmdArray[0]}  # platform=1 plat_spec_encoding=0 language=0 name=1 Family
    echo ${cmdArray[1]}  # offset=  59 lenght= 14 Lucida Console
    echo ${cmdArray[3]}  # offset=  73 lenght=  7 Regular
    echo ${cmdArray[5]}  # offset=  80 lenght= 35 Lucida Console Regular; B&H alpha25
    echo ${cmdArray[7]}  # offset= 115 lenght= 14 Lucida Console
    echo ${cmdArray[9]}  # offset= 129 lenght= 12 Version 1.60
    echo ${cmdArray[11]} # offset= 141 lenght= 13 LucidaConsole
    echo ${cmdArray[13]} # offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    Il m'appartiendra de récupérer le dernier champ de chaque ligne "offset..." mais ça, je devrais y arriver.

    PS : Flodelarab, je n'ai strictement rien compris à ton explication, désolé.

    Excellente journée (suis absent jusqu'à demain), encore merci !

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 278
    Points : 13 564
    Points
    13 564
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Flodelarab, je n'ai strictement rien compris à ton explication, désolé.
    Ben c'est bien dommage car c'est l'explication la plus crue de ton problème. Il fallait juste enlever les parenthèses. Mais tu as préféré mettre tout ton travail à la poubelle au profit d'une solution que tu ne comprends pas plus, au prétexte qu'elle "marche". Tu aurais pu utiliser ta mésaventure pour apprendre définitivement la différence entre ( ), $( ), <( ), (( )), { ;}.


  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Bonjour,

    Citation Envoyé par Flodelarab Voir le message
    Ben c'est bien dommage car c'est l'explication la plus crue de ton problème.
    Pour moi il n'y a aucune explication...

    Regarde, tu écris :
    Citation Envoyé par Flodelarab Voir le message
    Tu as mis ( ) (sous-processus) quand tu voulais mettre $( ) (substitution de commande).
    j'aurais surement mieux compris si tu avais écrit
    Tu as mis ( ) (sous-processus) quand il fallait mettre $( ) (substitution de commande) parce que le sous-processus renvoie ... quand la substitution de commande renvoie ...
    De plus,
    Citation Envoyé par Flodelarab Voir le message
    Il fallait juste enlever les parenthèses.
    Admettons.
    Mais alors, pourquoi je les retrouve dans ta réponse ?
    Citation Envoyé par Flodelarab Voir le message
    Tu as mis ( ) quand tu voulais mettre $( ).
    Tu vois les points d'interrogation dans mes yeux ?


    Regarde ce qu'a écrit N_BaH :
    atab n'est pas un tableau.là, tu aurais un tableau.
    Simple et efficace !

    Citation Envoyé par Flodelarab Voir le message
    Tu aurais pu utiliser ta mésaventure pour apprendre définitivement ...
    Je te te cacherai pas qu'au départ, c'est un petit outil de management des fontes que je veux construire, tout ce que j'ai vu sur le web ne me satisfaisant pas.
    Au début je pensais que ça serait simple mais c'était sans compter avec la sournoiserie du contenu des .ttf et autres .otf...
    Et donc, comme d'habitude, il faut être ingénieur 5e niveau en technologie nucléaire juste pour allumer la lumière du salon et pouvoir enfin lire un livre.
    Bon, j'exagère un peu, mais tu vois l'idée,

    Bises et bon week-end,

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Bonsoir,

    Citation Envoyé par Jipété Voir le message
    Il m'appartiendra de récupérer le dernier champ de chaque ligne "offset..." mais ça, je devrais y arriver.
    J'ai présumé de mes forces...

    J'ai d'abord commencé par une simulation toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aline="offset=  59 lenght= 14 Lucida Console" # simulation d'une ligne parmi 7
    echo $aline
    offset= 59 lenght= 14 Lucida Console
    qui a bien fonctionné, alors je me suis enhardi, en comptant sur mes doigts quel était le champ à récupérer : le 5e et plus si affinités.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $aline | cut -d ' ' -f 5
    Lucida
    et comme on peut le voir ci-dessous, après un petit parcours du man, tout est bon. En simulation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $aline | cut -d ' ' -f 5- # le '-' indique qu'il faut récupérer jusqu'à la fin de la ligne, et effectivement :
    Lucida Console
    avec un seul mot à récupérer ça fonctionne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    aline="offset=  59 lenght= 14 Lucida"
    echo $aline
    offset= 59 lenght= 14 Lucida
    echo $aline | cut -d ' ' -f 5
    Lucida
    echo $aline | cut -d ' ' -f 5-
    Lucida
    Mais plus dans le script, où ça ne fonctionne pas, et c'est ça que je ne comprends pas.
    La sortie montrée ce matin ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    offset= 59 lenght= 14 Lucida Console
    offset= 73 lenght= 7 Regular
    offset= 80 lenght= 35 Lucida Console Regular; B&H alpha25
    offset= 115 lenght= 14 Lucida Console
    offset= 129 lenght= 12 Version 1.60
    offset= 141 lenght= 13 LucidaConsole
    offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    7 lignes parfaites, auxquelles je rajoute le "cut" précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}" | cut -d ' ' -f 5-; done
    mais le résultat est foireux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lenght=  14   Lucida Console
    lenght=   7   Regular
    lenght=  35   Lucida Console Regular; B&H alpha25
     14   Lucida Console
     12   Version 1.60
     13   LucidaConsole
     57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    Je tente plus sophistiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<${#cmdArray[*]}; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    mais j'ai strictement le même résultat que précédemment.

    C'est quoi la différence entre les lignes 1 et 4 de la sortie sans "cut", qui sont identiques (sauf pour l'offset, que je n'utilise pas) ?
    Ou entre les lignes 2 et 6 qui n'ont qu'un seul champ ?

    Je reste un peu sans voix et sans voie pour avancer, là...

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Tests de ce soir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # script.sh complet :
    binaryPath="/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge"
    fonte="/usr/share/fonts/AutresFontes/Machine/LUCON.TTF"
    mapfile -t cmdArray < <($binaryPath/showttfcustom -n $fonte | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) 
     
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[*]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[*]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[*]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[*]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    Les 4 lignes précédentes retournent à chaque fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lenght=  14   Lucida Console
    lenght=   7   Regular
    lenght=  35   Lucida Console Regular; B&H alpha25
     14   Lucida Console
     12   Version 1.60
     13   LucidaConsole
     57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    et malheureusement pour moi, shellcheck script.sh ne retourne ni erreur ni warning.

    Je suis sec, là...

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 245
    Points : 4 742
    Points
    4 742
    Par défaut
    bonjour

    je ne comprend rien a ton problème, il me semble que tu cherches a compliquer les choses ...

    Pourquoi vouloir un "tableau" ?
    Pourquoi faire un traitement après avoir ton tableau ?

    Tu ne désires pas une chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ta_commande |  awk -F'lenght=' '/lenght/ {print substr($2,6,99)}'
    EDIT: attention, ici, ne fonctionne que si noms sont inférieurs à 100 !

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 320
    Points : 12 878
    Points
    12 878
    Par défaut
    cut n'est pas adapté dans ton cas qui semble mélanger des espace et des tabulations comme séparateur.

    Si on prend ton exemple parfait que tu donnes pour tester cela fonctionne donc celui-ci n'est pas représentatif du problème.

    de plus , je ne comprend pas trop pourquoi tu passes par ${array[@]:x:1} au lieu de ${array[x]}.

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Bonjour aussi,

    Citation Envoyé par papajoker Voir le message
    je ne comprends rien a ton problème, il me semble que tu cherches a compliquer les choses ...
    Oh tu sais, ce n'est pas moi qui ai compliqué les choses, c'est les concepteurs du format ttf...

    C'est un peu l'enfer dans ces fichiers, même pour les pros puisqu'en utilisant les outils de haut niveau (fpTTF dans FreePascal, piloté par Lazarus) sur une liste de fontes, certains remontent bien le nom du fichier et d'autres rien du tout, alors qu'en examinant le .ttf avec un éditeur hexa, on voit bien que les données y sont présentes.
    D'où l'utilisation (avec ma modif pour accéder à la table NAME sinon c'est l'enfer) de l'outil showttf produit par FontForge, qui permet d'accéder aux données.

    Et cette foutue ligne (printf un peu plus bas, que je n'arrive pas à parser...) commençant par "Offset" contient dans son dernier champ les données dont j'ai besoin.
    Je commence à comprendre que "cut" a des problèmes car les champs seraient séparés par des "tab", ce matin j'ai trouvé cette commande :
    Or, if you only want to print that one column, use cut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -d$'\t' -f 6  < file.txt
    là, presque tout à la fin : https://unix.stackexchange.com/quest...b-as-delimiter

    j'essaie de l'adapter à mes besoins ainsi :
    d'abord un test, le résultat au bout de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s\n' "${cmdArray[@]:1:1}" ###--> offset=  59 lenght=  14   Lucida Console --OK
    ensuite 3 essais :
    (le "f 5-" signifie que je veux le 5e champ et ce qui le suit sur la ligne s'il y a (et des fois il y a)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cut -d$'\t' -f 5- < $(printf '%s\n' "${cmdArray[@]:1:1}") ###--> $(printf '%s\n' "${cmdArray[@]:1:1}") : redirection ambiguë
    cut -d$'\t' -f 5- < ${printf '%s\n' "${cmdArray[@]:1:1}"} ###--> ${printf '%s\n' "${cmdArray[@]:1:1}"} : mauvaise substitution
    cut -d$'\t' -f 5- < printf '%s\n' "${cmdArray[@]:1:1}" ###--> printf: Aucun fichier ou dossier de ce type
    J'en suis là, à l'heure où tu as posté, et je ne vois pas comment avancer,

    J'ai lu quelque part que "Redirection ambigue" voulait dire qu'un champ avait plusieurs données et qu'il fallait donc double-quoter, mais j'ai l'impression que je l'ai déjà fait, non ?

    EDIT : disedorgue, je te répondrai + tard, j'attends un livreur de frigo d'une minute à l'autre...

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 320
    Points : 12 878
    Points
    12 878
    Par défaut
    Si on revient sur ta syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    comme ceci, cela devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo $aline | cut -d ' ' -f 5-; done

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 245
    Points : 4 742
    Points
    4 742
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Oh tu sais, ce n'est pas moi qui ai compliqué les choses, c'est les concepteurs du format ttf...
    ...
    C'est quand même toi qui fait un xxx | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) pour après :
    - mettre le résultat dans un tableau
    - boucler sur ce tableau pour encore appliquer des filtres


    Le tableau existe pourquoi ? pour compliquer ? tu ne sembles pas l'utiliser par la suite puisque contenu non valide
    Pourquoi ne pas appliquer dés le début un filtre sur ta commande "showttfcustom" ? comme j'ai proposé (le principe)en #9 (et /éventuellement/ ne pas utiliser inutilement un tableau)

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    comme ceci, cela devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo $aline | cut -d ' ' -f 5-; done
    Bravo !
    Tu es vraiment un champion,

    Mais maintenant, je dirais que c'est complètement fou, ce résultat good, quand on constate que la seule différence entre ta 1re ligne (qui est aussi la mienne) et ta seconde, c'est que la variable aline de la 1re est quotée et la variable de la seconde ne l'est pas alors qu'on sait bien qu'il vaut mieux quoter les variables !
    Je pensais donc bien faire en quotant, tout en me protégeant de variables non initialisées.
    Moi y en a plus rien comprendre...

    En attendant, voilà le résultat, parfait avec cette fonte, plus qu'à tester avec le millier d'autres qui se trainent ici et là...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Lucida Console
    Regular
    Lucida Console Regular; B&H alpha25
    Lucida Console
    Version 1.60
    LucidaConsole
    Lucida is a registered trademark of Bigelow & Holmes Inc.

    Et pour ça :
    Citation Envoyé par disedorgue Voir le message
    cut n'est pas adapté dans ton cas qui semble mélanger des espaces et des tabulations comme séparateur.
    Pourquoi l'as-tu conservé dans ta solution ? Pas moyen de faire autrement ?

    +++

    Citation Envoyé par papajoker Voir le message
    ...- mettre le résultat dans un tableau
    Plus sympa pour moi de travailler avec un tableau de données.

    Citation Envoyé par papajoker Voir le message
    ...Le tableau existe pourquoi ? pour compliquer ?
    relire la ligne précédente.

    Citation Envoyé par papajoker Voir le message
    ...tu ne sembles pas l'utiliser par la suite puisque contenu non valide
    Si le contenu avait été valide, je l'aurais utilisé.

    Citation Envoyé par papajoker Voir le message
    ...Pourquoi ne pas appliquer dés le début un filtre sur ta commande "showttfcustom" ? comme j'ai proposé (le principe) en #9
    Parce que je n'ai pas vu que tu avais ajouté ce texte.

    Citation Envoyé par papajoker Voir le message
    ...- boucler sur ce tableau pour encore appliquer des filtres
    Oui, je fais les choses en plusieurs temps, c'est déjà suffisament compliqué comme ça, relis ce que je réponds à disedorgue quelques lignes plus haut...

    Bon, le frigo est en place, tout va bien, je peux recocher

    Merci à tous, en espérant ne pas revenir en trainant un cauchemar derrière moi.
    Bon wik,

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 320
    Points : 12 878
    Points
    12 878
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Mais maintenant, je dirais que c'est complètement fou, ce résultat good, quand on constate que la seule différence entre ta 1re ligne (qui est aussi la mienne) et ta seconde, c'est que la variable aline de la 1re est quotée et la variable de la seconde ne l'est pas alors qu'on sait bien qu'il vaut mieux quoter les variables !
    Je pensais donc bien faire en quotant, tout en me protégeant de variables non initialisées.
    Moi y en a plus rien comprendre...
    Ici, la devise s'applique:
    on doit toujours quoter les variables sauf si on sait pourquoi on ne le fait pas


    Citation Envoyé par Jipété Voir le message
    Pourquoi l'as-tu conservé dans ta solution ? Pas moyen de faire autrement ?
    Je n'ai pas cherché de solution alternative, j'ai juste contourné le problème de cut qui ne sait pas prendre une classe de caractère au lieu du caractère lui-même.

    De mon point de vu, je serais plus en accord avec papajoker.

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, la devise s'applique :
    on doit toujours quoter les variables sauf si on sait pourquoi on ne le fait pas
    Explique-nous, qu'on ne meure pas idiots.

    Citation Envoyé par disedorgue Voir le message
    Je n'ai pas cherché de solution alternative, j'ai juste contourné le problème de cut qui ne sait pas prendre une classe de caractère au lieu du caractère lui-même.

    De mon point de vue, je serais plus en accord avec papajoker.
    Mais je ne demande qu'à apprendre.
    Comme quand j'étais petit garçon et qu'on me prenait par la main pour traverser la rue.

    De mon point de vue, je suis parti avec l'idée de récupérer les chemins des fichiers ttf mais ça n'est pas aussi simple qu'on le croit puisque les procédures et autres fonctions écrites en Pascal ne réussissent pas toujours à trouver les données dans les .ttf et/ou .otf.

    À partir de là, ça devient un peu de l'improvisation, et j'avoue que si je n'avais pas débusqué ce fichier showttf.c chez FontForge, j'aurais abandonné mon idée de gestion perso de mes fontes.

    Alors que là, je vais m'y remettre, dans quelques jours.
    Et, oui, j'ai trouvé que pour réunir un nom de fichier et son emplacement dans l'arborescence du système de fichiers un tableau irait très bien, à condition de réussir à s'affranchir des galères de \t.
    Merci à toi.

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 320
    Points : 12 878
    Points
    12 878
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Explique-nous, qu'on ne meure pas idiots.
    C'est simple, ici on est dans l'unique cas où il ne faut pas protéger une variable qui fait que la commande echo se retrouve a afficher non pas un paramètre (qui est la chaine entre quote) mais n paramètres qui est chaque mot de la chaine.
    Donc là, on sait pourquoi on n'a pas quoté la variable

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Ah d'accord !
    J'avais bien vu que le champ no 5 avait 1 ou n paramètre(s) mais je ne connaissais pas la subtilité pour tous les afficher d'un coup.

    Malheureusement, je suis toujours aussi boulet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ test="1 2 3"
    $ echo $test
    1 2 3
    $ echo "$test"
    1 2 3
    J'avoue que je ne vois pas de différence entre $test et "$test"...

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 320
    Points : 12 878
    Points
    12 878
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ XX="1     2      3"
    $ echo $XX
    1 2 3
    $ echo "$XX"
    1     2      3

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ XX="1     2      3"
    $ echo $XX
    1 2 3
    $ echo "$XX"
    1     2      3
    J'ai compris (enfin, je pense). La preuve :
    Citation Envoyé par disedorgue;12044261 et adapté par Jipété
    C'est simple, ici on est dans l'unique cas où il ne faut pas protéger une variable, ce qui fait que la commande echo se retrouve à afficher non pas un paramètre (qui est la chaine entre quotes) mais n paramètres qui est chaque mot de la chaine. qui sont les mots de la chaine séparés par espace(s) et/ou tabulation(s).
    C'est bien, non ?

    La question subsidiaire juste par curiosité, c'est : comment construire une chaine de plusieurs mots séparés par des tabulations ? Parce que quand je commence à taper, au prompt, XX="aTAB <-- la touche TAB, la ligne de commande devient XX="afifo , et si je tente XX="1TAB il ne se passe rien : où est passé le fonctionnement de la touche TAB des bonnes vieilles Underwood qui déplaçaient le rouleau ?
    Et afifo doit être stocké quelque part, reliquat de très vieilles manips.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Crystal] transformation d'une date en numéro de semaine
    Par barna dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/03/2017, 10h41
  2. [RegEx] Extraire un nombre d'une grande chaine de caractères
    Par casier dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2011, 16h35
  3. Réponses: 1
    Dernier message: 26/02/2009, 19h13
  4. Découpage d'une grande image vers des textures
    Par djar dans le forum OpenGL
    Réponses: 14
    Dernier message: 26/02/2005, 19h46
  5. [C#] [ADO] Parcours d'une grande quantité d'enregistrements
    Par Wavyx dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/09/2004, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo