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 15/12/2009, à 01:17

Pylades

[Résolu] Caractère * dans les expressions régulières [bash,sed]

Bonjour !
Je suis en train de me faire un petit (en fait plutôt gros) script bash, et j'ai un problème avec sed.
J'ai une chaîne de la forme foo1,.foo1:foo2,.foo2:foo3,.foo3
Et je voudrais obtenir ceci : foo1 foo2 foo3
Ceci dans le but de pouvoir faire un cat.
Je tape donc ceci :

cat $(echo $files | sed -e 's/,.*:/\ /g')

Mais malheureusement, sed me renvoie foo1 foo7,.foo7.
En fait, il "match" le plus grand nombre possible de caractère, à cause du *
Comment faire pour qu'il ne "match" que la plus petite séquence possible, et que mon code marche ?

Merci de m'avoir lu jusque là, malgré le manque de clarté de mon exposé, et merci d'avance pour vos réponses.

Dernière modification par Paul0102 (Le 15/12/2009, à 01:44)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2 Le 15/12/2009, à 01:21

sputnick

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

sed -r 's/[\,\.]|:/ /g' <<< 'foo1,.foo1:foo2,.foo2:foo3,.foo3'

Avec un example ca passe toujours nickel wink


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 15/12/2009, à 01:25

Pylades

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

Merci pour la réponse rapide !
Malheureusement, cela me donne :
foo1  foo1 foo2  foo2 foo3  foo3
Et non pas :
foo1 foo2 foo3


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#4 Le 15/12/2009, à 01:26

MBt

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

salut,
Il faut lui préciser les caractères que tu veux ou ceux que tu ne veux pas.
Exemple :
1/ si tous tes foo sont séparés par un caractère spécifique (virgule par ex) et que tu acceptes tous les caractères tu peux chercher /[^,]+]/ ce qui veut dire tout sauf virgule
2/ si tous tes foo ne comportent que des lettres et des chiffres mais que tu ne connais pas le caractère qui les sépare tu peux faire /[a-zA-Z1-9]+/

pense à préférer le + à * car * peut être une chaine vide.
A+
MBt

Hors ligne

#5 Le 15/12/2009, à 01:29

MBt

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

essaye

sed -r 's/,[^:]*:?/ /g' <<< 'foo1,.foo1:foo2,.foo2:foo3,.foo3'

"virgule" puis tous les caractères sauf "deux-points" puis éventuellement "deux points" à remplacer par espace

Dernière modification par MBt (Le 15/12/2009, à 01:35)

Hors ligne

#6 Le 15/12/2009, à 01:31

sputnick

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

sed -r 's/(\,\.|:)/ /g' <<< 'foo1,.foo1:foo2,.foo2:foo3,.foo3'

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 15/12/2009, à 01:31

Pylades

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

En fait, j'ai une liste de couple de fichiers.
Les couples sont séparés par ':' , les fichiers du couple par ',' .
Les seconds fichiers du couple sont des fichiers cachés, mais celà a peu d'importance.
Ce que je voudrais, c'est récupérer les premiers fichiers de chaque couple, séparés par des espaces.

EDIT :
@MBt : ton code me donne foo1 foo2 foo3,.foo3
Un cut, et c'est réglé !
Merci !

Dernière modification par Paul0102 (Le 15/12/2009, à 01:33)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#8 Le 15/12/2009, à 01:34

sputnick

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

On peux tromper 1 fois 1000 personnes, nan 1000 fois 1 personne...
Je rigole, mais donne plutot un exemple concret stp...


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 15/12/2009, à 01:36

MBt

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

ça doit être bon maintenant

sed -r 's/,[^:]*:?/ /g' <<< 'foo1,.foo1:foo2,.foo2:foo3,.foo3'

j'ai modifié mon post plus haut aussi.
MBt

Hors ligne

#10 Le 15/12/2009, à 01:40

Pylades

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

Merci, le dernier code marche !
Et un exemple concret, c'est de ça :

/home/paul/Bureau/Cours/Concours/2005/histo,/home/paul/Bureau/Cours/Concours/2005/.histo:/home/paul/Bureau/Cours/Concours/2006/histo,/home/paul/Bureau/Cours/Concours/2006/.histo:/home/paul/Bureau/Cours/Concours/2007/histo,/home/paul/Bureau/Cours/Concours/2007/.histo:/home/paul/Bureau/Cours/Concours/2008/histo,/home/paul/Bureau/Cours/Concours/2008/.histo:/home/paul/Bureau/Cours/Concours/2009/histo,/home/paul/Bureau/Cours/Concours/2009/.histo

Vers ça !

/home/paul/Bureau/Cours/Concours/2005/histo /home/paul/Bureau/Cours/Concours/2006/histo /home/paul/Bureau/Cours/Concours/2007/histo /home/paul/Bureau/Cours/Concours/2008/histo /home/paul/Bureau/Cours/Concours/2009/histo

Encore une fois merci à vous deux !


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#11 Le 15/12/2009, à 01:41

MBt

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

Non non sputnick, elle marche pas ta solution... big_smile
tu vas avoir des doublons : foo1 foo1 foo2 foo2 foo3 foo3.
Il veut foo1 foo2 foo3!

J'ai donné une solution qui fonctionne Aujourd'hui à 00:36 big_smile

Ils sont pas toujours facile à comprendre les ubunteros, il faut souvent s'y mettre à plusieurs!

Edit :
Je viens de lire le post au dessus, c'est encore pire que ce que je pensais.
T'as bien fait de demander un exemple Sputnik. Quand je disais qu'il faut deux cerveaux pour en comprendre un! smile

Edith:
Je pensais avoir écrit une ânerie mais dans mon erreur j'ai bon!
La chance parfois...

MBt

Dernière modification par MBt (Le 15/12/2009, à 01:45)

Hors ligne

#12 Le 15/12/2009, à 01:44

sputnick

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

echo $(sed -r 's/:/\n/g; s/[[:alnum:]]+\,\.//g' <<< 'foo1,.foo1:foo2,.foo2:foo3,.foo3')

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#13 Le 15/12/2009, à 01:52

sputnick

Re : [Résolu] Caractère * dans les expressions régulières [bash,sed]

Ha, tu a pas précisé si tu veux la partie de gauche ou de droite quand ya ,. donc si on garde ce qu'il y a à droite :

sed -r 's/:/\n/g; s/,[[:alnum:]/]+//g' <<< '/home/paul/Bureau/Cours/Concours/2005/histo,/home/paul/Bureau/Cours/Concours/2005/.histo:/home/paul/Bureau/Cours/Concours/2006/histo,/home/paul/Bureau/Cours/Concours/2006/.histo:/home/paul/Bureau/Cours/Concours/2007/histo,/home/paul/Bureau/Cours/Concours/2007/.histo:/home/paul/Bureau/Cours/Concours/2008/histo,/home/paul/Bureau/Cours/Concours/2008/.histo:/home/paul/Bureau/Cours/Concours/2009/histo,/home/paul/Bureau/Cours/Concours/2009/.histo'
/home/paul/Bureau/Cours/Concours/2005/histo.histo
/home/paul/Bureau/Cours/Concours/2006/histo.histo
/home/paul/Bureau/Cours/Concours/2007/histo.histo
/home/paul/Bureau/Cours/Concours/2008/histo.histo
/home/paul/Bureau/Cours/Concours/2009/histo.histo

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne