Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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é yikes ; 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]

fabkzo a écrit :

@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 ?

Lowercase.


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