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
A voir également:

3 réponses

UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158
 
Salut,

La partie à récupérer correspond toujours à des caractères en majuscule ?
Ou c'était juste un exemple (les majuscules) ?
0
flow825
 
Les majuscules c'étaient pour rendre plus visible mais ils ne sont pas en majuscule à la base.
0
UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   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
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
Utilisateur anonyme
 
salut,

en bash :
$ filename="sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc"
$ filename="${filename##*(}"
$ echo "${filename::3}
ABC
0
flow825
 
il doit manquer quelle que chose dans la deuxième lignes car en exécutant les trois lignes j'obtiens : sau
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > 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
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > 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
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
$ echo $BASH_VERSION
4.4.19(1)-release
sur ArchLinux.
0
Exileur Messages postés 1475 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