#1 Le 20/06/2014, à 16:17
- McRbt
[Résolu] Ajouter un point-virgule au bout de X caractère(s)
Bonjour,
J'écris un script pour traiter des fichiers csv.
J'ai une ligne de cette forme là, soit X un caractère tel qu'il soit : 00;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Je voudrais qu'un point-virgule se place au 2ème caractère, au 7ème, au 13ème, au 21ème et au 29ème.
Ce qui me donnerai : 00;XX;XXXXX;XXXXXX;XXXXXXXX;XXXXXXXX;XXXXXXXXXXXX.
J'avais penser à un sed -i, puisque cette modification doit s'effectuer sur le fichier passer en paramètre.
Pouvez-vous m'orienter ?
Dernière modification par McRbt (Le 23/06/2014, à 16:52)
Hors ligne
#2 Le 20/06/2014, à 17:50
- pingouinux
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
Bonjour,
sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Ajouter -i si c'est bon
sed -ri 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Hors ligne
#3 Le 23/06/2014, à 09:33
- McRbt
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
pingouinux,
J'ai testé ta ligne de commande. A première vue, elle a l'air de fonctionner, cependant cela ne dois affecter que la première ligne.
J'ai essayé :
head -1 fichier.csv | sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
et :
sed -n 's/\r//;1p' fichier.csv | sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Sans résultat concluant.
Dernière modification par McRbt (Le 23/06/2014, à 09:33)
Hors ligne
#4 Le 23/06/2014, à 09:43
- pingouinux
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
Voilà !
sed -r '1s/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Hors ligne
#5 Le 23/06/2014, à 10:41
- McRbt
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
pingouinux,
Tout simplement.
Cependant, peut-on lui indiquer qu'il faut commencer après le 00; ?
Est-ce bon comme ceci ?
sed -r '1s/(00;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Puis, j'ai remarqué que si on relancais le script, après l'avoir lancé, des ; s'insérer un peu n'importe où.
Dernière modification par McRbt (Le 23/06/2014, à 10:47)
Hors ligne
#6 Le 23/06/2014, à 11:53
- pingouinux
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
Évidemment, si tu modifies les spécifs au fur et à mesure…
Cette commande traitera la 1ère ligne du fichier, si elle commence par "00;", et ne contient aucun autre ";".
sed -r '1s/^(00;)([^;]{2})([^;]{5})([^;]{6})([^;]{8})([^;]{8})([^;]*)$/\1\2;\3;\4;\5;\6;\7/' fichier.csv
Hors ligne
#7 Le 23/06/2014, à 16:21
- McRbt
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
pingouinux,
Évidemment, si tu modifies les spécifs au fur et à mesure… hmm
Autant pour moi, je n'ai pas été assez précis.
Mais sinon tu as résolu mon problème, je passe en résolu.
J'ai encore une question pour toi, comment peut-on supprimer les blancs présents à la première et dernière ligne ? Si possible avec un sed -i, puisque le fichier en entrée doit être modifié.
J'ai pensé à un truc dans ce style :
sed -ni 's/\r//; 1p' fichier.csv | tr -d ' '
sed -ni 's/\r//; $p' fichier.csv | tr -d ' '
Dernière modification par McRbt (Le 23/06/2014, à 16:22)
Hors ligne
#8 Le 23/06/2014, à 16:32
- pingouinux
Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)
Pour supprimer les blancs des première et dernière lignes
sed '1s/ //g;$s/ //g' fichier.csv
et pour supprimer aussi '\r'
sed '1s/[\r ]//g;$s/[\r ]//g' fichier.csv
Ajouter ensuite -i si c'est bon
sed -i .....
Ajouté :
Autre façon de faire
sed '1ba;$ba;b;:a;s/[\r ]//g' fichier.csv
ou bien
sed '1!{$!b};s/[\r ]//g' fichier.csv
Dernière modification par pingouinux (Le 24/06/2014, à 07:24)
Hors ligne