Extraction chaîne de caractères dans Shell

PatMh Messages postés 19 Statut Membre -  
 alf -
Bonjour,
J'ai besoin d'une petite aide sous shell, svp.
Je désire extraire les caractères 1 par 1 ou par bloc (caract 2 à 5 par exemple) dans le contenu de cette chaîne de caractères suivante.
TEST=/etc/machin:/etc/truc
Mon intention réelle est de récupérer
/etc/machin dans une variable
/etc/truc dans une autre variable.
Je pense utiliser une boucle for sachant le nombre de caractères par len=${#TEST}

Merci de votre aide pour mettre dans la bonne voie.
@+
Pat
Configuration: Windows XP
Internet Explorer 7.0
Ubuntu 6.10

30 réponses

  • 1
  • 2
  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    [jp@MDK tmpfs]$ TEST="/etc/machin:/etc/truc"
    
    [jp@MDK tmpfs]$ echo ${TEST#*:}
    /etc/truc
    
    [jp@MDK tmpfs]$ echo ${TEST%:*}
    /etc/machin
    
    [jp@MDK tmpfs]$
    ;-))
    14
    1. alf
       
      trop fort JIPICY
      merci beaucoup
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    $ TEST=/etc/machin:/etc/truc
    $ MACHIN=${TEST%%:*}
    $ TRUC=${TEST##*:}
    $ echo $MACHIN
    /etc/machin
    $ echo $TRUC
    /etc/truc
    
    4
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    lami20j@debian:~$ TEST=/etc/machin:/etc/truc
    lami20j@debian:~$ echo ${TEST:1:3}
    etc
    
    Regarde dans la faq pour les explications
    le remplacement de variables en shell bash
    0
  4. PatMh Messages postés 19 Statut Membre 1
     
    Merci de ton aide lami20j
    j'ai tapé les lignes :
    $ TEST=/etc/machin:/etc/truc
    $ echo ${TEST:1:3}
    et cela me retourne
    Syntax error: Bad substitution

    J'ai fouiné dans les différentes faq mais sans succés.

    Merci encore de ton aide, stp.
    Pat
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    tu dois faire une erreur quelque part
    fait une imprimé de ton écran pour voir ce que tu tape exactement
    voilà chez moi https://www.cjoint.com/?gcpKzVFaiw
    0
  7. PatMh Messages postés 19 Statut Membre 1
     
    Salut,

    J'ai du nouveau.
    J'ai tapé les lignes sur vi (et non pas en programmation)
    et j'ai bien obtenu etc

    J'ai oublié de te dire que je rédige en shell
    (début de programme par #!/bin/sh)

    Si dans mon programme je tape la ligne
    TEST=/etc/machin:/etc/truc:/etc/bidule

    Comment faire pour extraire du caractère 2 à 7 par exemple, stp ?

    Bon, je débute ... et je vais te poser une question stupide mais tant pis !
    C'est hors sujet et je m'en excuse par avanace, c'est exceptionnel.

    J'ai des problèmes avec l'éditeur vi.
    C'est à dire qu'à mon centre de formation, quand j'appuie sur la touche Ech puis sur la touche i
    je passe en mode insertion et le message s'affiche et je peux bosser correctement.
    Ici chez moi, ce n'est pas le cas, le vi ne réagit pas pareil.
    Par exemple { ressemble à un trait vertical ondulé ... et les commandes ne répondent pas comme sur ma machine à mon centre de formation.

    J'ai manipé aussi le terminal pour comprendre et j'ai vu qu'il y a différents codages de caractères :
    Locale courante UTF-8
    Europe centrale (Windows 1250)
    Europe centre (ISO-8859-2)
    Europe centrale (IBM852)
    Lequel je prends, stp ?

    Donc, je programme sous l'éditeur.
    Là, toutes les commandes claviers sont correctes.

    Merci de ton éclairage.
    Désolé de t'embêter avec mes problèmes.

    Pat
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    lami20j@debian:~$ TEST=/etc/machin:/etc/truc:/etc/bidule
    lami20j@debian:~$ echo ${TEST:1:6}
    etc/ma


    J'ai des problèmes avec l'éditeur vi.
    C'est à dire qu'à mon centre de formation,


    je pense qu'à ton centre de formation tu utilises vim et pas vi
    affiche le résultat de la commande
    whereis vi{,m}
    choisi Locale courante UTF-8
    0
  9. PatMh Messages postés 19 Statut Membre 1
     
    lami20j,

    j'ai tapé ces lignes de commandes dans mon éditeur :
    TEST=/etc/machin:/etc/truc:/etc/bidule
    echo ${TEST:1:6}

    Puis, par Ctl Alt F1 j'ai lancé mon script.
    Le résultat est Syntax error: Bad subsititution
    Je ne vois pas mon erreur.

    Dans la même fenêtre, j'ai lancé la commande whereis vi{,m} :
    rootk@patrick-ubuntu:~/shell# whereis vi{,m}
    vi: /usr/bin/vi /usr/X11R6/bin/vi /usr/bin/X11/vi /usr/share/man/man1/vi.1.gz
    vim: /usr/bin/vim /usr/bin/vim.tiny /etc/vim /usr/X11R6/bin/vim /usr/X11R6/bin/vim.tiny /usr/bin/X11/vim /usr/bin/X11/vim.tiny /usr/share/vim /usr/share/man/man1/vim.1.gz

    Effectivement, j'ai bien noté à mon centre au sujet de l'éditeur vim.
    Je viens de faire à l'instant apt-get install vim mais cela ne fonctionne pas. je pense qu'il me faut la liaison internet et comme ce n'est pas encore installé sur l'autre machine ...

    Si tu es encore dispo pour m'aider sur mon pb de variable, je t'en remercie par avance.
    Pat
    0
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Pour le script il n'y a pas d'erreur

    En ce qui concerne vim, il est déjà installé sur ton OS
    vim: /usr/bin/vim

    Tu n'as qu'à ouvrir les fichiers avec vim et pas avec vi

    Tant que tu ne m'affiche pas exactement ce que tu fais, par exemple un imprimé écran je ne peux rien faire.
    0
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Je vois que l'erreur est à la ligne 124
    affiche le résultat de la commande
    sed '120,130!d' ton_script
    --
    lami20j
    0
  12. PatMh Messages postés 19 Statut Membre 1
     
    Le résultat est :
    sed: -e expression n°1, caractère 4: commande inconnue: `.'

    est-ce par ce qu'il y a des caractères spéciaux comme / que cela ne fonctionne pas ?
    0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Voilà ce que j'ai moi
    lami20j@debian:~$ perl -ne 'print if 1 .. 5' .bashrc
    # .bashrc
    
    # User specific aliases and functions
    
    # Source global definitions
    lami20j@debian:~$ sed '1,5!d' .bashrc
    # .bashrc
    
    # User specific aliases and functions
    
    # Source global definitions
    
    0
  14. PatMh Messages postés 19 Statut Membre 1
     
    Effectivement, ce n'est pas la même réponse.

    Je vais repartir sur un fichier neuf et maniper.
    Je pense que je trouverai l'erreur en cours de route.
    Enfin, j'espère !
    Si de ton côté tu as du neuf, merci par avance.

    A plus tard lami20j et je te remercie très sincérement de ta patience et de ton aide.

    Bien amicalement,

    Pat
    0
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Si de ton côté tu as du neuf, merci par avance.

    je ne peux rien avoir de neuf, tant que je n'ai pas les réponses à mes questions :-))
    pour simplifier les choses je te propose de m'envoyer ton script par mail (voir mon profil)
    sinon exécute le script avec sh -x ou sh -xv pour dépister la vraie erreur
    lami20j@debian:~$ cat ccm.sh
    #!/bin/bash
    TEST=/etc/machin:/etc/truc:/etc/bidule
    echo ${TEST:1:6}
    lami20j@debian:~$ sh -x ccm.sh
    + TEST=/etc/machin:/etc/truc:/etc/bidule
    + echo etc/ma
    etc/ma
    lami20j@debian:~$ sh -vx ccm.sh
    #!/bin/bash
    TEST=/etc/machin:/etc/truc:/etc/bidule
    + TEST=/etc/machin:/etc/truc:/etc/bidule
    echo ${TEST:1:6}
    + echo etc/ma
    etc/ma
    


    0
  16. Fred
     
    Bonjour, excusez moi d'intervenir sur ce post mais j'ai un problème qui se rapproche de ceux traités ici, si qqun est dans le coin pour m'aider, je vous remercie grandement :)
    J'ai besoin d'extraire une chaine de caractère et j'essaie d'utiliser la syntaxe indiquée ici.
    Voici mon script :
    echo "resultat"
    echo $env
    echo "extraction"
    echo ${env:2:2}
    et ça ne marche pas, voici ce qui est produit :
    resultat
    MT0707
    extraction
    test3[7] : ${env:2:2} : 0403-011 substitution non valide pour cette commande

    Malgrès tout votre post, je ne comprend vraiment pas comment je peux extraire une chaine de caractère incluse dans une autre chaine de caractères ...

    Merci
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    mais la variable env contient quoi?
    ou c'est la commande env que tu veux utiliser?
    0
  18. Fred
     
    Bonjour Lami,
    env est une variable qui contient la chaine de caractère MT0707 et je veux extraire un bout de cette chaine (les 4 derniers caractères en fait qui sont mois et année).

    env est récupéré depuis un fichier par la commande
    env = `cat tutu`
    tutu étant un fichier contenant une seule ligneavec MT0707 dedans (je galère complet je dois l'avouer parce que j'imagine que c'est faisable directement, mais bon...).

    Bref pour les 4 derniers caractères comme je ne sais pas trop ce que signifie les 2 chiffres après , j'ai préféré mettre 2:2 comme ça je suis sûr que mon problème ne vient pas de là , et donc ici je voudrai récupérer T0 ou peut-être T je sais pas mais je veux récupérer un extrait de la chaine de caractère MT0707
    0
  19. Fred
     
    Re ,
    Afin d'éviter toute ambiguité (je ne savais pas que env etait le nom d'une commande également), j'ai refait mon script en remplaçant env par xxx pour être bien sûr que c'est considéré comme une variable. Malheureusement, le résultat est le même.
    0
  20. Fred
     
    Pour info et au vu du post, je précise que je suis sous vi , et quand je tape whereis vi il me repond "vi : /usr/bin/vi"
    0
  • 1
  • 2