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 31/08/2012, à 23:25

thurston

[RESOLU] Aide sed awk et printf pour chaine char à manipuler

Bonjour

J'ai une phrase type comme suit (correspond à ce que je dois concaténer d'origine diverses U: m3u, F: file, D: repertoire)
zen:U|/media/zen.m3u#D|/media/mpd-Playlists#U|/tmp/speed.m3u#F|/tmp/song.mp3

EDIT: il manquait un | après le dernier F, corrigé pour cohérence dans l'énoncé

J'aurais voulu conserver tout ce qui est en gras avec une manipulation (sed, awk, printf?...), à savoir pour simplifier et en conservant leur ordre d'apparition dans la phrase (c'est pour rappeler dans une fenetre zenity (les chemins sont bien plus longs que ceux montrés) l'essentiel pour choix):
- toutes les lettres avant |
- tout ce qui se trouve entre le dernier / et le # suivant
- et tout ce qui se trouve entre le tout dernier / et la fin de la phrase.

Le bonus serait d'intercaler
- le caractère : entre U,F,D (type de source) et la source effective réduite au "basename"
- et un + entre les blocs indiquant la concaténation.
Ca donnerait donc, sur l'exemple:
U:zen.m3u + D:mpd-Playlists + U:speed.m3u + F:song.mp3

je bidouille depuis + d'1/2 heure google + autre...mais y a pas, moi pas parler sed. (m'a semblé indiqué, avec awk et printf...)
Quelqu'un peut etre?
D'avance merci
A+
T

Dernière modification par thurston (Le 01/09/2012, à 09:52)

Hors ligne

#2 Le 31/08/2012, à 23:37

Bousky

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

Je considère qu'il doit y avoir un "|" derrière le "F" et que c'est un oubli dans ton exemple. Pas testé (je suis pas sous Linux pour l'instant) :

sed -r 's-\([UFD]\)\|[^#]*/\([^/#]\)-\1:\2-g;s/#/ + /g'

Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#3 Le 01/09/2012, à 08:19

pingouinux

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

Bonjour,
C'était presque bon, mais sans pouvoir tester, ce n'est pas facile…

$ sed -r 's/^[^:]*://;s-([UFD])\|[^#]*/([^/#])-\1:\2-g;s/#/ + /g' <<<"zen:U|/media/zen.m3u#D|/media/mpd-Playlists#U|/tmp/speed.m3u#F|/tmp/song.mp3"
U:zen.m3u + D:mpd-Playlists + U:speed.m3u + F:song.mp3

Hors ligne

#4 Le 01/09/2012, à 09:51

thurston

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

Ah zut, désolé pour l'énoncé inexact. Non de non, pourtant j'avais voulu que ce soit clair.
J'ai corrigé dans le premier test et merci encore à tous les 2, ca va vraiment rendre mon interface de script super efficace
(J'étais loin d'y arriver au fait, malgré google et autre).
A+
T

@pingouinux: il va bientot plus rester grand chose qui n'a pas été touché par tes soins dans mon gros script de traitement de biblio mp3. Le résultat est quasi atteint et ces derniers détails d'interface fignolent le tout vraiment bien. Tu avais bien sûr repéré la continuité dans mes différents posts. (je prépare le post décrivant le principe: montré à des potes et validé à l'utilisation par des non-informaticiens de 4 à 42 ans pour l'instant.)

Dernière modification par thurston (Le 01/09/2012, à 09:57)

Hors ligne

#5 Le 01/09/2012, à 10:08

Bousky

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

Il me semble que l'on peut simplifier (toujours pas testé) :

$ sed 's/^[^:]*://;s-\|[^#]*/-:-g;s/#/ + /g'

On doit pouvoir le faire en trois substitutions bash tongue

Dernière modification par Bousky (Le 01/09/2012, à 10:14)


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#6 Le 01/09/2012, à 12:47

pingouinux

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

Après test de l'expression de Bousky #5, voici ce qui marche :

$ sed 's/^[^:]*://;s-|[^#]*/-:-g;s/#/ + /g' <<<"zen:U|/media/zen.m3u#D|/media/mpd-Playlists#U|/tmp/speed.m3u#F|/tmp/song.mp3"
U:zen.m3u + D:mpd-Playlists + U:speed.m3u + F:song.mp3

Avec sed, selon que l'on utilise l'option -r ou pas, il faut mettre ou pas des \ devant | , ( et ) . C'est vraiment piégeant.

Hors ligne

#7 Le 01/09/2012, à 13:49

thurston

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

ok merci cette dernière version m'est en plus abordable (je veux dire pour compréhension et réutilisation dans d'autres contextes similaires)
A+
T

Hors ligne

#8 Le 01/09/2012, à 14:34

Bousky

Re : [RESOLU] Aide sed awk et printf pour chaine char à manipuler

pingouinux a écrit :

Avec sed, selon que l'on utilise l'option -r ou pas, il faut mettre ou pas des \ devant | , ( et ) . C'est vraiment piégeant.

Sachant que c'est inversé entre | et () roll


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne