|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Bonjour,
encore une question avec sed. Je cherche à extraire, dans un fichier, toutes les chaines de caractère commençant par une lettre de lecteur (C, D, E, c, d...) et terminant les lignes : Exemple du fichier : Code :
Résultat attendu : Code :
Donc une lettre de lecteur sera le début de la chaine à extraire [a-zA-Z], et elle sera toujours suivie de l'expression :\ soit : Code :
extraire toutes les parties de droite des chaines du ffichier commençant par [a-zA-Z]:\ Code :
sed -n '/ [a-zA-Z]:\\*$/s/^.*\( [a-zA-Z]:\\*$\)/\1/p' Ce n'est pas tant la commande exacte qui m'intéresse mais surtout le cheminement pour mettre en forme cette recherche Merci |
||||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : mai 2006 Messages : 350 ![]() |
Examinons cette regex :
Elle cherche à reconnaître un espace, suivi d'une lettre, suivi d'un deux-points, suivi de zéro, une ou plusieurs barres obliques inverses, suivies de la fin de la chaîne. Ça ne ressemble pas vraiment à ce que tu cherches. Tu n'aurais pas oublié un point quelque part, des fois ?
__________________
There's nothing like $HOME! |
|
|
00
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Salut, et merci
Citation:
Code :
sed -n '/ [a-zA-Z]:\\$/s/^.*\( [a-zA-Z]:\\$\)/\1/p' Citation:
Code :
sed -n '/ [a-zA-Z]:\\.*$/s/^.*\( [a-zA-Z]:\\*$\)/\1/p' Si j'ai bien compris, le point dans une expression régulière indique n'importe quel caractère seul http://www.gentoo.org/doc/fr/articles/l-sed1.xml Mais, dans la formulation du problème, je ne vois pas où j'aurais besoin de situer "n'importe quel caractère seul" ? |
||
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Citation:
Tu lui dis ici que le \ est en fin de ligne. Ce n'est pas ce que tu veux. Comment ça ? J'ai essayé ta commande (en ajoutant un point), sur ton fichier d'entrée, et ça marche. Note : l'espace qui est devant la lettre de lecteur, je pense que tu veux la sortir du groupe ( ). |
|
|
|
00
|
|
|
#5 | ||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Ok, alors comme ceci ça a l'air déjà mieux
Code :
Je n'arrive pas à saisir comment sortir l'espace du groupe Code :
|
||||
|
|
00
|
|
|
#6 | |
|
Membre expérimenté
![]() Inscription : mars 2007 Messages : 469 ![]() |
Citation:
Version correcte ci-dessous : Code :
sed -n '/ [a-zA-Z]:\\.*$/s/^.*\( [a-zA-Z]:\\.*$\)/\1/p' Important à comprendre : . --> un caractère quelconque * --> 0 à n fois le caractère qui précède .* --> 0 à n fois un caractère quelconque [a-zA-Z]:\\.*$ un caractère alphabétique (minuscule ou masjucule) suivi de un caractère : suivi de un caractère \ suivi de un caractère quelconque présent 0 à n fois jusqu'à la fin de la ligne La commande suivante est plus précise car on remplace le * par un + Code :
sed -n '/ [a-zA-Z]:\\.\+$/s/^.*\( [a-zA-Z]:\\.\+$\)/\1/p' + --> 1 à n fois le caractère qui précède Un peu prise de tête
__________________
Loi de Murphy: La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi. La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi. Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi. |
|
|
|
00
|
|
|
#7 | |
|
Membre éprouvé
![]() Inscription : mai 2006 Messages : 350 ![]() |
Citation:
Code :
sed -n '/[a-zA-Z]:\\.*$/ s/^.*\([a-zA-Z]:\\.*$\)/\1/p' Si, cependant, il peut arriver que tu aies une chaîne de la forme "aa:\" dans ton fichier et que dans ce cas là tu ne veux pas que ça corresponde, tu peux utiliser une ancre de début de mot \<, là où tu plaçais ton espace (en gros), comme ceci : Code :
sed -n '/\<[a-zA-Z]:\\.*$/ s/^.*\<\([a-zA-Z]:\\.*$\)/\1/p'
__________________
There's nothing like $HOME! |
|
|
|
00
|
|
|
#8 | ||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Salut,
merci pour toutes ces lumières. Toutefois, aucune de ces commandes ne renvoie la totalité du résultat attendu. Code :
Et si j'applique ces commandes à un fichier de présentation + complexe, par exemple un rapport antivirus Code :
|
||||
|
|
00
|
|
|
#9 |
|
Membre éprouvé
![]() Inscription : mai 2006 Messages : 350 ![]() |
Ça n'est pas normal, mais pas normal du tout. J'ai testé les commandes que j'ai proposées, elles renvoient bien les résultats attendus. Là, il va falloir que tu nous expliques comment exactement tu appelles sed, c'est à dire ce que tu mets exactement sur ta ligne de commande.
__________________
There's nothing like $HOME! |
|
|
00
|
|
|
#10 | ||||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Bon au moins c'est rassurant si ça marche chez vous. Alors pour faire simple, le fichier test s'appelle z.txt et il contient ceci :
Code :
Code :
sed -n '/\<[a-zA-Z]:\\.*$/ s/^.*\<\([a-zA-Z]:\\.*$\)/\1/p' z.txt Code :
EDIT >> aïe... je viens d'enlever l'accent de "répertoire" à la deuxième ligne du fichier test. IDu coup la commande renvoie bien f:\Dossier en plus. Ca vient des accents, merde ça va faire comme sur le post que j'ai créé tout à l'heure avec awk qui ignore des variables contenant des caractères spéciaux http://www.developpez.net/forums/sho...d.php?t=502913 Code :
|
||||||
|
|
00
|
|
|
#11 |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 709 ![]() |
Alternative grep?
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT Jabber: ripat at im.apinc.org |
|
|
00
|
|
|
#12 | ||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Salut,
ripat ta commande semble fonctionner (j'ai levé l'espace devant [a-z] sinon il est reporté dans le résultat : Code :
Code :
|
||||
|
|
00
|
|
|
#13 | |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 709 ![]() |
Citation:
Ceci ne doit pas être capturéC:/ mais bien ceci A:/exemple L'idéal est d'utiliser l'assertion \b qui marque la séparation des mots et qui ne consomme pas de caractères. C'est une assertion de position. Avantage: si tu as une ponctuation devant ta chaîne à capturer, elle ne capturera que cette chaîne *sans* la ponctuation.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT Jabber: ripat at im.apinc.org |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com