Probléme de cut

Résolu
flow825 -  
 flow825 -
Bonjour,

J'ai une variable en shell qui reçois des noms de fichiers comme cela :

sauvegarde--test_(futurs_testeur)_(XYZabcdefg)-20180530-1114.toc
sauvegarde-fichier-tuille1_(XYZgdrhgfg)-20180530-1114.toc
sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc

Puis j'utilise la commande suivante pour récupérer la partie en gras :

echo $filename | cut -d "(" -f2 | cut -d ")" -f1 | cut -c1-3


Cependant pour le premier nom de fichier cela ne fonctionne pas car le cut ce réalise sur la première parenthèse.

Est-il possible de faire en sorte que le cut s’effectue sur les dernières parenthèses pour éviter que dans les cas ou il y ai plus de deux parenthèse dans le nom de fichier de récupère la bonne valeur ?

Merci de vos réponse

3 réponses

  1. UnGnU Messages postés 1468 Statut Contributeur 158
     
    Salut,

    La partie à récupérer correspond toujours à des caractères en majuscule ?
    Ou c'était juste un exemple (les majuscules) ?
    0
    1. flow825
       
      Les majuscules c'étaient pour rendre plus visible mais ils ne sont pas en majuscule à la base.
      0
      1. UnGnU Messages postés 1468 Statut Contributeur 158 > flow825
         
        Ok, je me doutais un peu ;-\

        Mais bon...

        $ cat f1
        sauvegarde--test_(futurs_testeur)_(XYZabcdefg)-20180530-1114.toc
        sauvegarde-fichier-tuille1_(XYZgdrhgfg)-20180530-1114.toc
        sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc

        $ sed 's/.*(\(...\).*/\1/' f1
        XYZ
        XYZ
        ABC

        $ grep -Po '.*\(\K...' f1
        XYZ
        XYZ
        ABC

        Transposé sur une variable :
        $ var="sauvegarde-fichier-tuille1_(XYZgdrhgfg)-20180530-1114.toc"

        $ sed 's/.*(\(...\).*/\1/' <<<"${var}"
        XYZ
        0
    2. flow825
       
      Merci sa fonctionne nikel, bien que j'ai un peu de mal a comprendre comment fonctionne les regex hormis que les trois points doivent correspondre à la partie conservé.
      0
  2. Utilisateur anonyme
     
    salut,

    en bash :
    $ filename="sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc"
    $ filename="${filename##*(}"
    $ echo "${filename::3}
    ABC
    0
    1. flow825
       
      il doit manquer quelle que chose dans la deuxième lignes car en exécutant les trois lignes j'obtiens : sau
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > flow825
       
      Salut,

      Il manque un antislash pour protéger la parenthèse ;-(

      $ filename="sauvegarde--test_(futurs_testeur)_(XYZabcdefg)-20180530-1114.toc"

      $ filename="${filename##*\(}"

      $ echo "${filename::3}"
      XYZ
      0
    3. Utilisateur anonyme > flow825
       
      il manque un guillemet à la fin de la troisième ligne (
      echo "${filename::3}"
      ), mais ça ne justifie pas le résultat que tu annonces.
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Utilisateur anonyme
       
      Salut,

      Quel shell utilises-tu ?

      Chez moi en bash (4.3.11(1)), si je ne protège pas la parenthèse dans
      ${filename##*\(}
      j'ai aussi le même résultat que flow825 ;-(


      $ filename="sauvegarde--test_(futurs_testeur)_(XYZabcdefg)-20180530-1114.toc"

      $ filename="${filename##*(}"

      $ echo "${filename::3}"
      sau
      0
    5. Utilisateur anonyme > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      $ echo $BASH_VERSION
      4.4.19(1)-release
      sur ArchLinux.
      0
  3. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    Erf, pour une fois que le sujet avait l'air de sortir un peu du thème général de la section;
    Je me rend compte que j'ai mal lu le titre.

    C'est vicieux, le "l" et le "t" se ressemble de beaucoup!

    Belle regex @UnGnU
    0