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. 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é.
  2. 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.
  3. 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

    Discussions similaires

    Final cut pour Windows ?

    43 réponses