Probléme de cut

Résolu
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. 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
    1. salut,

      en bash :
      $ filename="sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc"
      $ filename="${filename##*(}"
      $ echo "${filename::3}
      ABC
      1. il doit manquer quelle que chose dans la deuxième lignes car en exécutant les trois lignes j'obtiens : sau
      2. Contributeur
        @flow825Salut,

        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
      3. @flow825il manque un guillemet à la fin de la troisième ligne (
        echo "${filename::3}"
        ), mais ça ne justifie pas le résultat que tu annonces.
      4. Contributeur
        @Utilisateur anonymeSalut,

        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
      5. @zipe31
        $ echo $BASH_VERSION
        4.4.19(1)-release
        sur ArchLinux.
    2. Contributeur
      Salut,

      La partie à récupérer correspond toujours à des caractères en majuscule ?
      Ou c'était juste un exemple (les majuscules) ?
      1. Les majuscules c'étaient pour rendre plus visible mais ils ne sont pas en majuscule à la base.
      2. Contributeur
        @flow825Ok, 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
      3. 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é.

    Discussions similaires

    Final cut pour Windows ?

    43 réponses