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 :
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
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
-
ContributeurSalut,
La partie à récupérer correspond toujours à des caractères en majuscule ?
Ou c'était juste un exemple (les majuscules) ?
-
-
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 -
-
-
salut,
en bash :$ filename="sauvegarde-démarche_qualité_(ABCfergregg)-20180530-1114.toc"
$ filename="${filename##*(}"
$ echo "${filename::3}
ABC-
-
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 -
@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.
-
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 -
@zipe31
$ echo $BASH_VERSION
sur ArchLinux.
4.4.19(1)-release
-
-
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