[sed, awk, tr, cut...] j'ai besoins d'un coup de pouce

j’ai une chaine, par exemple fichier_blabla_020.jpg
et je ne veut reccuperer que le nombre 020, l’estensions, et les supprimés.
Vous pouvez me donner une piste please ?
j’ai chercher avec cut, mais je ne voit pas comme selectionner les caracteres depuis le fin de la ligne.
awk et sed sont pour moi de grands mysteres… :confused:

Marchi d’avance :ange:

ton fichier à la fin tu veux qu’il s’appel 020.jpg ou fichier_blabla ?

fichier_blabla_ :kaola:

echo fichier_toto_020.jpg | sed -n ‘s/(.*_)([0-9]{3}).([a-zA-Z]{3})/\1/gp’

tout devien plus simple qd on connait sed et awk :clap:

Merci baucoup myocastor :jap:
Tu peut me faire la meme chose pour reccuperer le numero maintenant stp ? :smiley:

j’avais tout prévu :stuck_out_tongue:

echo fichier_toto_020.jpg | sed -n ‘s/(.*_)([0-9]{3}).([a-zA-Z]{3})/\2/gp’

tu devineras jamais comment trouver l’extension :d

Merci mille fois ! :kimouss:

Allez j’essaie l’extension :
echo fichier_toto_020.jpg | sed -n ‘s/(.*_)([0-9]{3}).([a-zA-Z]{3})/\3/gp’

Merci myocastor :jap: pour cette leçon de sed

myocastor -> est ce que tu pourrais nous expliquer comment fonctionne cette belle commande car là j’ai un peu de mal ! [:yeoh]

sed traite ligne à ligne un fichier ou des entrées sur stdin .
On peut donc le “piper” et récupérer le résultat sur stdout.

Une des façons de lui balancer une chaine a traiter est donc le echo la_chaine | sed …

l’option -n indique de ne pas afficher la chaine à traiter mais seulement le résultat.

La commande appliquée est la subsitution : s
qui marche selon le modèle : s/ce_qu’on_cherche/ce_qu’on_met_à_la_place/

On fait suivre de g ( traiter toutes les occurences traitées ) et p ( print )

donc s/…/…/gp

Pour ce qu’on cherche, il s’agit d’écrire une expression rationnelle qui décrit le truc:

On écrit donc:
un caractère quelconque : .
répété de 0 à n fois : *
soit .*
suivi d’underscore : _
le nom du fichier est donc .*_

On veut ensuite isoler ce motif pour pouvoir le réutiliser, il faut donc le placer entre parenthèses
(.*_)
il peut être rappelé ensuite par son numéro d’ordre. Si c’est le premier regroupement entre (), c’est donc \1

NB: pour empecher le shell d’interpréter les ( ) , il faut les protéger, donc les faire précéder d’un \

Au finale : (.*_)

De la même façon, trois chiffres s’écrivent:
un caractère compris entre 0 et 9 : [0-9]
répété 3 fois {3}
en protégeant les accolades, et en faisant un regroupement:
([0-9]{3})

ensuite l’extension:
idem sauf qu’il s’agit de lettres donc de caractères compris entre a et z ou A et Z, ce qui s’écrit : [a-zA-Z]
soit:
([a-zA-Z]{3})

Myocastor -> C’est génial ! Merci :super:

Il faudrait créer un topic sur tout ce qui touche au script, cela parrait vraiment intéressant. :super:

execellent !
Moi je suis pour l’idée du topic script

Ouaiiii un topic dédié aux scripts! Je suis POUR.

A ce propos, si quelqu’un connait un/des bon(s) site(s) de tutoriaux de script shell (genre exercices + corrigés).

Sur google il existe quelques sites d’universités mais rien de très poussé.

The_Nail> http://absfr.tuxfamily.org/abs-fr/ c’est la traduc du célèbre advanced bash scripting guide.

Excellent! Merci bien

excuse moi myocastor malgrés tes explications, j’ai passer 3/4 d’heures a me casser les dents pour tenter de reccuperer dans une url separement le nom du fichier, la version et l’extension.

Une url style : http://nasgaia.org/var/nasgaia-1.0/Nbuilds/X11/LIB/jpeg-6b.tar

donc je veux isoler jpeg, 6b et tar
Merci d’avance pour ton coup de pouce :jap:

En fait j’ai bien compris le principe de sed, ce sont les expressions regulieres qui ne veulent pas rentrée dans mon crane. :frowning:

echo ton_truc | sed -n ‘s/./([^/])-(.).(.)$/\1/gp’
echo ton_truc | sed -n ‘s/./([^/])-(.).(.)$/\2/gp’
echo ton_truc | sed -n ‘s/./([^/])-(.).(.)$/\3/gp’

Merci Ô grand magincien des expressions :jap: :kimouss:

-> lithium
t’as installé nasgaia ?
a un moment pendant l’install, il a planté en boucle sur les at qu’il arrivait pas a lire (j’ai verifié les md5 pourtant)
j’ai ressayé et ca a replanté au meme endroit.