Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2007, 22h32   #1
Membre confirmé
 
Inscription : décembre 2002
Messages : 452
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 452
Points : 265
Points : 265
Par défaut [Regex] Erreur caractères surnuméraires - conversion date

Bonjour,
  • Introduction
Tout d'abord, je tiens à preciser que je tiens à signaler que je ne cherche pas forcement la reponse toute faite, mais que l'on m'explique pourquoi cela ne marche.

Cela me désole, des qu'il s'agit d'une regex un peu compliqué, cela ne marche jamais avec moi.

  • Sujet
J'ai un fichier excel avec 3 colonnes pouvant contenir n'importe quel caractères. Je fais un copié collé des cellules du tableur dans mon gvim. J'obtiens donc par exemple ce genre de résultat :


  • Résultat attendu

Citation:
insert MATABLE set f1='33' ,f2='77' ,f3='33';
insert MATABLE set f1='4' ,f2='8' ,f4='333';
  • Mes premiers tests :

J'ai fais le choix d'utiliser le caractère # délémiteur pour que ce soit un peu plus claire au du \.

J'ai tenté ceci
Code :
:%s#\(^.*)\t\(.*)\t(.*$)#\1#g
mais cela me mets comme erreur :
Citation:
E54: \( ouvrante non fermée
E478 : Commande non valide
  • Mon raisonnement :

Je vous explique comment j'ai ecris mon pattern. N'hesitez pas à me corriger la ou mon raisonnement n'est pas correct. J'ai donc fais expres de bien comment j'ai écris le pattern.

pattern : \(^.*)\t\(.*)\t(.*$)

Le premier sous ensemble :

Le premier sous ensemble commence dès le début de la ligne (utilisation de ^)
et et est une suite de 1 ou plusieurs caractères :
Le premier sous ensemble s'arrete a la première tabulation, je mets donc juste apres le premier sous \t
Pour que le premier sous ensemble soit bien reconnu comme sous ensemble, je mets un \
Le deuxième sous ensemble :

Le deuxième sous ensemble commence juste apres la première tabulation et il est constitué de n'importe quel caractères et se termine par la 2ème tabulation :
Le troisième sous ensemble :

Le troisième sous ensemble est commence apres la 2ème tabulation. Il est constitué de n'importe quel caractère et est à la fin de la ligne (utilisation de $)
Ou me suis je trompé ?
weed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2007, 23h41   #2
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par weed
  • Sujet
J'ai un fichier excel avec 3 colonnes pouvant contenir n'importe quel caractères. Je fais un copié collé des cellules du tableur dans mon gvim. J'obtiens donc par exemple ce genre de résultat :


  • Résultat attendu

Code :
1
2
3
 
insert MATABLE set f1='33' ,f2='77' ,f3='33';
insert MATABLE set f1='4' ,f2='8' ,f4='333';

Tout d'abord, bonne idée de mettre '#' au lieu de '/', c'est déja +clair

Important à savoir, la recherche .*\t est de type "gourmande".
C'est à dire que la recherche ne s'arrêtera pas à la 1ère tabulation rencontrée mais à la dernière.
Exemple :
33\t77\t33

Astuce pour ne sélectionner que jusqu'à la 1ère tabulation :
^[^\t]*\t/
Signifie : sélectionne ( à partir du début de la ligne ^ ) tous les caractères différents de tabulation ( [^\t] ) présents 0 ou n fois ( * ) jusqu'à la tabulation suivante ( \t ).
Résultat :
33\t77\t33

Pour mémoriser une partie de la chaîne, en l'occurence les chiffres sans la tabulation : \( \)
^\([^\t]*\)\t

Avec ces éléments, tu peux décoder l'instruction ci-dessous qui doit fonctionner

:s#\(^[^\t]*\)\t\([^\t]*\)\t\([^\t]*$\)#insert MATABLE set f1='\1', f2='\2', f3='\3'#

http://www.shellunix.com/regexp.html
__________________
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.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 12h19   #3
Membre confirmé
 
Inscription : décembre 2002
Messages : 452
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 452
Points : 265
Points : 265
Par défaut Date conversion

Tout d'abord, merci mille fois BlaireauOne.
J'ai vraiment compris le truc. Je ne regarde pas ma regex sur mon post, je l'as refais à chaque fois que j'en ai besoin.


Par contre je bloque sur une date. J'ai une date francais, j'aimerais bien la convertir au format iso yyyy-mm-dd.

J'aimerais le faire en php avec preg_replace par exemple mais avant tout j'aimerais bien tester sous gvim.

J'ai donc fais ceci :
Code :
%s#\([0-9{1,2}\)\/\([0-9{2}\)\/\([0-9{2,4}\)#\3-\2\1#g
gvim me retourne comme erreur :
E:488 caractères surnuméraires

Qu'est ce que cela veut dire ? J'ai regardé sur google mais que de chi :
http://www.google.fr/search?hl=fr&q=...chercher&meta=
weed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 15h47   #4
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Citation:
Envoyé par weed
J'ai donc fais ceci :
Code :
%s#\([0-9{1,2}\)\/\([0-9{2}\)\/\([0-9{2,4}\)#\3-\2\1#g
gvim me retourne comme erreur :
E:488 caractères surnuméraires
Ca irait pas mieux en fermant les crochets ?

Code :
%s#\([0-9]{1,2}\)\/\([0-9]{2}\)\/\([0-9]{2,4}\)#\3-\2\1#g
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 22h09   #5
Membre confirmé
 
Inscription : décembre 2002
Messages : 452
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 452
Points : 265
Points : 265
ahh super. C'etait du a cela pour mon erreur.

Lorsque j'execute cela me met motif introuvable alors que je mets mon curseur avec 12/12/2006....

Je ne vois pas ou j'ai fais une faute dans mon pattern.

Je fais une recherche
d'une suite de chiffre (1 seul ou 2)
puis le caractère /
d'une suite de chiffres (2 chiffres uniquement)
puis le caractère /
et une suite de chiffres (2 ou 4 chiffres)

L'espression peut se trouver n'importe ou dans la ligne, je n'ai donc pas spécifié ni de ^ ni de $
weed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 23h11   #6
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par weed
Je ne vois pas ou j'ai fais une faute dans mon pattern.

Il ne manque plus que des antislash devant les accolades ouvrantes et fermantes et ça marche

Petit conseil. Si PB de ce genre, faire une recherche progressive du + simple au + complexe.

Sous vim, recherche de chaîne /

/[0-9] OK, on continue
/[0-9]{2} pas OK, on appelle l'aide en ligne
:help pattern
__________________
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.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h17.


 
 
 
 
Partenaires

Hébergement Web