#1 Le 28/08/2015, à 13:04
- fabkzo
Modif chemin avec sed [RESOLU]
Bonjour,
Je cherche à traiter un chemin du type :
./images/type/01/s1/JPG/
pour le transformer afin de nommer un fichier dans ce style :
01-s1.jpg
Mais je me prends les pattes dans le sed si j'ose dire :-(
Ce que je veux c'est pouvoir enlever tout ce qui existe avant le couple (ou triplet ) de chiffres + tout ce qui existe après le dernier slash (lui y compris).
ensuite je change les slash avec des tirets...
Utiliser sed seul est-il la bonne solution? Ou dois-je passer par d'autres commandes ?
Quelqu'un pourrait-il m'aider?
Dernière modification par fabkzo (Le 28/08/2015, à 19:06)
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#2 Le 28/08/2015, à 15:14
- nany
Re : Modif chemin avec sed [RESOLU]
Bonjour,
nany@stupidcomputer:~$ echo "./images/type/01/s1/JPG/" | sed 's#^.*/\([0-9]*\)/\([[:alnum:]]*\)/\([[:alpha:]]*\)/.*#\1-\2.\3#;s#.*#\L&#'
01-s1.jpg
nany@stupidcomputer:~$
Hors ligne
#3 Le 28/08/2015, à 15:16
- pingouinux
Re : Modif chemin avec sed [RESOLU]
Bonjour,
Oui, sed est adapté à ce cas, mais ce n'est pas très clair.
Ce que je veux c'est pouvoir enlever tout ce qui existe avant le couple (ou triplet ) de chiffres + tout ce qui existe après le dernier slash (lui y compris).
ensuite je change les slash avec des tirets...
Avec ce que tu demandes, cette ligne
./images/type/01/s1/JPG/
devrait donner ceci
01-s1-JPG
Peux-tu préciser, ou donner d'autres exemples ?
Hors ligne
#4 Le 28/08/2015, à 15:53
- fabkzo
Re : Modif chemin avec sed [RESOLU]
Bonjour,
@nany: merci je suis impressionné ; malheureusement je vais devoir l'adapter - et je suis en train d'essayer de traduire .
@pingouinux : c'est à peu près cela, en fait je génère une liste de dossiers contenant des images sur lesquelles je veux faire un traitement, mais j'ai besoin de créer un nom pour chaque "grappe" que je colle dans une variable
voilà d'autres exemples de chemins à convertir :
./home/toto/images/type/01/s1/JPG
./home/toto/images/type/01/s2/JPG
./home/toto/images/type/01/s2/p1/JPG
./home/toto/images/type/02/s2/n/JPG
./home/toto/images/type/03/JPG
et le résultat recherché :
01-s1
01-s2
01-s2-p1
02-s2-n
03
Auparavant j'ai essayé d'appliquer à mon cas ce que tu avais produis là SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs
avec grep et sed mais je m'embrouille...
Dernière modification par fabkzo (Le 28/08/2015, à 16:04)
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#5 Le 28/08/2015, à 16:22
- pingouinux
Re : Modif chemin avec sed [RESOLU]
for i in ./home/toto/images/type/01/s1/JPG ./home/toto/images/type/01/s2/JPG ./home/toto/images/type/01/s2/p1/JPG ./home/toto/images/type/02/s2/n/JPG ./home/toto/images/type/03/JPG
do
sed -r 's#.*/([0-9]+/?.*)/.*#\1#;s#/#-#g' <<<"$i"
done
01-s1
01-s2
01-s2-p1
02-s2-n
03
Hors ligne
#6 Le 28/08/2015, à 18:00
- fabkzo
Re : Modif chemin avec sed [RESOLU]
Ah Merci ! C'est nickel !
J'essaie de déchiffrer pour bien comprendre, mais je ne vois pas où tu déclare que tu veux virer ce qui se trouve en fin de chemin ( dans cet exemple /JPG )
Je lis ça comme ça: "cours" jusqu'au premier ensemble chiffré de 0 à 9999+en prenant ce qu'il y a derrière le slash suivant puis remplace la ligne par cet ensemble; ensuite remplace les slash restants par des tirets.
Ca m'étonne qu'on ait pas besoin de ^ au départ ( comme dans la ligne de nany )
@nany: j'ai compris que tu créais 3 groupe déclarés par [0-9], [[:alnum:]], et [[:alpha:]] , par contre que signifie \L& en fin de ligne ?
Dernière modification par fabkzo (Le 28/08/2015, à 18:06)
pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com
Hors ligne
#7 Le 28/08/2015, à 19:31
- nany
Re : Modif chemin avec sed [RESOLU]
@nany: j'ai compris que tu créais 3 groupe déclarés par [0-9], [[:alnum:]], et [[:alpha:]]
Oui, mais j’ai mal interpréter le coup des triplets (je croyais qu’il pouvait y avoir des nombres à trois chiffres). Du coup la solution de pingouinux est largement plus adaptée.
, par contre que signifie \L& en fin de ligne ?
En résumé, si tu veux récupérer le dernier groupe après le dernier slash pour mettre comme extension, en mettant le tout en minuscule, on peut reprendre le code de pingouinux en le transformer comme ceci :
sed -r 's#.*/([0-9]+/?.*)/(.*)#\1.\2#;s#/#-#g;s#.*#\L&#'
Hors ligne
#8 Le 28/08/2015, à 19:43
- pingouinux
Re : Modif chemin avec sed [RESOLU]
@nany : Ta commande en #7 fonctionne bien avec les exemples donnés, mais s'il y a des majuscules dans les parties à conserver, elles seront traduites en minuscules aussi.
$ sed -r 's#.*/([0-9]+/?.*)/(.*)#\1.\2#;s#/#-#g;s#.*#\L&#' <<<"./home/toto/images/type/02/S2/N/JPG"
02-s2-n.jpg
Édité :
Je ferais plutôt ceci
$ sed -r 's#.*/([0-9]+/?.*)/(.*)#\1.\2#;s#/#-#g;s#\..*#\L&#' <<<"./home/toto/images/type/02/S2/N/JPG"
02-S2-N.jpg
Dernière modification par pingouinux (Le 28/08/2015, à 19:56)
Hors ligne
#9 Le 28/08/2015, à 19:54
- nany
Re : Modif chemin avec sed [RESOLU]
Voui, c’est bien pour ça que j’ai écrit :
en mettant le tout en minuscule
Si on ne veut que la fin en minuscule :
sed -r 's#.*/([0-9]+/?.*)/(.*)#\1.\L\2#;s#/#-#g'
Hors ligne
#10 Le 28/08/2015, à 20:11
- pingouinux
Re : Modif chemin avec sed [RESOLU]
Ah oui, c'est plus succint.
Hors ligne