[Sed]Aucune erreur mais fichier de sortie vide

Bonjour tout le monde :slightly_smiling:
Bon je reviens vous embeter :mrgreen: ,cette fois il s’agit de sed qui me fait des caprices (ou alors je n’ai pas tout compris à son fonctionnement).
J’ai un fichier csv que je voudrais modifier légèrement, en effet les dates sont au format AAAAMMJJ et je voudrais qu’elles se retrouvent au format AAAA-MM-JJ (ou AAAA/MM/JJ) afin de pouvoir les exploiter dans un tableur.Voici la ligne de commande que j’ai entré :sed -n -e 's/\(.*\)\([1-2][0|9]{2}[0-9]\)\([0-1][0-9]\)\([0-3][0-9]\)\(.*\)/\1\2-\3-\4\5/pg' < fichier_entrée.csv > fichier_sortie.csvsed s’execute sans aucune erreur mais le fichier de sortie est vide :cry:
Si quelqu’un pouvait m’expliquer le pourquoi du comment de la chose car je n’ai commencé avec sed que ce matin :confused:

Bonjour,
je te suggère de t’inspirer de cet exemple:

jcode@debian:~$ echo "cela existe depuis 20041201, c'est un fait" > fictest.cvs jcode@debian:~$ sed 's/\([0-9]...\)\([0-9].\)\([0-9].\)/\1-\2-\3/g' fictest.cvs cela existe depuis 2004-12-01, c'est un fait

ou plutôt ceci:

Merci j’ai réussi grace à toi :smiley:
J’ai essayé avec ton exemple et ça marchait plutot bien mais certains champs était transformé en date alors qu’ils ne devaient pas l’etre.En fait certains caractères devaient etre échappés.Voilà la formule qui marche bien sed -n -e 's/\([1-2][0\|9]\{2\}[0-9]\)\([0-1][0-9]\)\([0-3][0-9]\)/\1\-\2\-\3/pg' < fichier_entrée.csv > fichier_sortie.csv

Pour ton deuxième exemple il marche bien en effet.
Je débute avec sed et je ne connais pas encore toutes ses subtilités, donc je me permet de te poser une dernière question:
Apparemment ce sont les espaces en début et en fin d’expression qui changent tout,pourquoi?

Et bien parce que généralement, une date dans un texte est précédée et suivie d’un espace. Ainsi on localise bien ce qui théoriquement correspond à une date telle que tu la trouve formatée dans ton fichier cvs: une suite de 8 chiffres.

Note que l’expression :
“Au 20041201, x valait 5122000 et …”, rencontrée par sed dans ton fichier, conduira à sa conversion en "x valait 5112-00-00 " etc … ce qui peut-être problématique, et ne pourrait se résoudre qu’en recensant tout les cas possibles du fichier cvs où se rencontre 8 chiffres et en complexifiant le pattern utilisé par sed.

[quote=“usinagaz”]Note que l’expression :
“Au 20041201, x valait 5122000 et …”, rencontrée par sed dans ton fichier, conduira à sa conversion en "x valait 5112-00-00 " etc … ce qui peut-être problématique, et ne pourrait se résoudre qu’en recensant tout les cas possibles du fichier cvs où se rencontre 8 chiffres et en complexifiant le pattern utilisé par sed.[/quote]
Sa regexp étant relativement fine le problème est limité, ton exemple ne marche pas par exemple.

Oui tu as raison, j’ai mis ça comme ça avec des erreurs, mais voyons ceci:

En réctifiant la virgule, puis l’erreur sur la valeur de x (il manque un chiffre), on arrive à ce que je voulais dire.
La regex de yoshi est donc meilleure que mon exemple simpliste, mais remarque que c’est relatif, puisque:

$ echo "Au 20041201 , x valait 20071010 cacahuètes" | sed -n -e 's/\([1-2][0\|9]\{2\}[0-9]\)\([0-1][0-9]\)\([0-3][0-9]\)/\1\-\2\-\3/pg' Au 2004-12-01 , x valait 2007-10-10 cacahuètes