Utilisation de sed

Utilisation de sed - Shell/Batch - Programmation

Marsh Posté le 25-08-2006 à 09:22:52    

Bonjour!
 
Voilà mon problème (en ksh)...
 
J'ai:
$ cat nfs1
/expl:/expl
/app/archive_env:/app/archive_env
/helios2/env4t:/helios/env4t
 
 
Je veux obtenir (virgule comme séparateur):
/expl:/expl,/app/archive_env:/app/archive_env,/helios2/env4t:/helios/env4t
 
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/expl:/expl,/app/archive_env:/app/archive_env
 
Pourquoi manque t-il la dernière ligne?
Comment faire?
 
Merci!


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 25-08-2006 à 09:22:52   

Reply

Marsh Posté le 26-08-2006 à 09:58:21    

Philippe1971 a écrit :

Bonjour!
 
Voilà mon problème (en ksh)...
 
J'ai:
$ cat nfs1
/expl:/expl
/app/archive_env:/app/archive_env
/helios2/env4t:/helios/env4t
 
 
Je veux obtenir (virgule comme séparateur):
/expl:/expl,/app/archive_env:/app/archive_env,/helios2/env4t:/helios/env4t
 
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/expl:/expl,/app/archive_env:/app/archive_env
 
Pourquoi manque t-il la dernière ligne?
Comment faire?
 
Merci!


Je connais pas sed dans toutes ses subtilités. En général, je m'en sers pour transformer certains caractères d'une ligne en certains autres mais jamais pour concaténer des lignes.
Ton truc, moi je le ferais en awk qui est plus fin dans ses possibilités

awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1


 
La subtilité de ce truc, c'est que je ne mets pas de caractère "retour à la ligne" dans le "printf" central, je ne le mets qu'à la fin dans le bloc "END" donc toutes tes lignes seront concaténées en une seule.
Petit bug: la ligne se terminera par une virgule. Si cela te gène tu peux la supprimer en y rajoutant un "sed"

awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |sed -e "s/,$//"


 
Cours complet de shell ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf


Message édité par Sve@r le 26-08-2006 à 09:59:05

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-08-2006 à 13:14:21    

Une autre solution avec AWK :

awk '
{ printf("%s%s", (NR==1 ? "" : "," ), $0) }
END { print }
' nfs1


 
Pour la version SED, une solution possible (non testée) :

sed -n '$!N;${s/\n/,/g;p;}' nfs1


 
Jean-Pierre.

Reply

Marsh Posté le 29-08-2006 à 07:38:23    

Merci Sve@r la commande:
awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |sed -e "s/,$//"
remplie mon objectif!
De même avec la proposition de aigles pour awk (pas sed).
Merci à vous deux!
Philippe


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 29-08-2006 à 14:30:06    

Philippe1971 a écrit :

Merci Sve@r la commande:
awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |sed -e "s/,$//"
remplie mon objectif!
De même avec la proposition de aigles pour awk (pas sed).
Merci à vous deux!
Philippe


Ouais, je l'ai tapée rapidement sans trop me creuser la tête.
 
Question rapidité, je peux pas dire laquelle sera la meilleure. La version de "aigles" un peu plus subtile que la mienne ne lance qu'un processus alors que moi j'en enchaine 2... mais lui fait un test à chaque itération pour savoir s'il faut mettre la virgule ou pas alors que je n'en fais pas.
Mais je pense que si je devais adopter la version de "aigles", j'inverserais le test de façon à ce que le cas le plus courant soit mis en premier. Autrement dit, je remplacerais

printf("%s%s", (NR==1 ? "" : "," ), $0)


par

printf("%s%s", (NR!=1 ? "," : "" ), $0)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 30-08-2006 à 10:47:56    

En fait l'utilisation d'un test est inutile, on peut simplement faire :

printf("%s%s", sep, $0);
sep = ",";

Pour la première ligne lue, la variable sep est égale à "" (car non initialisée), par la suite elle vaut ",".
 
 
Jean-Pierre.

Reply

Marsh Posté le 30-08-2006 à 13:23:17    

Merci Sve@r et aigles!
Je ne l'ai pas fait mais pour comparer les résultats d'exécution il est possible -si mes souvenirs sont bons- d'utiliser la commande time.


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 30-08-2006 à 20:50:03    

aigles a écrit :

En fait l'utilisation d'un test est inutile, on peut simplement faire :

printf("%s%s", sep, $0);
sep = ",";

Pour la première ligne lue, la variable sep est égale à "" (car non initialisée), par la suite elle vaut ",".


EXCELLENT !!!!
 

Philippe1971 a écrit :

Merci Sve@r et aigles!
Je ne l'ai pas fait mais pour comparer les résultats d'exécution il est possible -si mes souvenirs sont bons- d'utiliser la commande time.


Exact. Mais pour un truc aussi mineur, personne n'ira se prendre la tête...


Message édité par Sve@r le 30-08-2006 à 20:51:19

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 31-08-2006 à 07:31:17    

Merci pour toutes ses solutions!
 


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 05-09-2006 à 16:53:56    

Bonjour, SED c'est un commande linux compatible windows pour remplacer des cheînes de caractéres ?
 
Vous ne conaitriez pas un tutorial en francais pour la commande sed ?


Message édité par webding le 05-09-2006 à 17:10:51
Reply

Marsh Posté le 05-09-2006 à 16:53:56   

Reply

Marsh Posté le 05-09-2006 à 18:50:53    

[:ark]  
 
http://www.google.fr/search?hl=fr& [...] cher&meta=
http://www.shellunix.com/sed.html


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 05-09-2006 à 18:57:56    

Bonjour et merci beaucoup

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed