Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2891 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Utilisation de sed

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de sed

n°1431171
Philippe19​71
Posté le 25-08-2006 à 09:22:52  profilanswer
 

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...
mood
Publicité
Posté le 25-08-2006 à 09:22:52  profilanswer
 

n°1431740
Sve@r
Posté le 26-08-2006 à 09:58:21  profilanswer
 

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.
n°1431803
aigles
Posté le 26-08-2006 à 13:14:21  profilanswer
 

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.

n°1432844
Philippe19​71
Posté le 29-08-2006 à 07:38:23  profilanswer
 

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...
n°1433070
Sve@r
Posté le 29-08-2006 à 14:30:06  profilanswer
 

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.
n°1433588
aigles
Posté le 30-08-2006 à 10:47:56  profilanswer
 

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.

n°1433666
Philippe19​71
Posté le 30-08-2006 à 13:23:17  profilanswer
 

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...
n°1433966
Sve@r
Posté le 30-08-2006 à 20:50:03  profilanswer
 

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.
n°1434076
Philippe19​71
Posté le 31-08-2006 à 07:31:17  profilanswer
 

Merci pour toutes ses solutions!
 


---------------
Dur de commencer le Shell...
n°1436927
webding
Posté le 05-09-2006 à 16:53:56  profilanswer
 

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
mood
Publicité
Posté le 05-09-2006 à 16:53:56  profilanswer
 

n°1437026
jagstang
Pa Capona ಠ_ಠ
Posté le 05-09-2006 à 18:50:53  profilanswer
 

[: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?  
n°1437033
webding
Posté le 05-09-2006 à 18:57:56  profilanswer
 

Bonjour et merci beaucoup


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Utilisation de sed

 

Sujets relatifs
chercher exemple simple d'utilisation de ComboBox()Utilisation de WM_PAINT
[help me] utilisation d un graph (graphedit)Batch - Erreur d'utilisation de la commande ncftpget
Utilisation D une variable dans un lien[Java] Problème de conception par rapport à l'utilisation d'une BD
Aide utilisation du logiciel Copilote[Résolu] Pb utilisation VLOOKUP
[VB6] Utilisation d'un inputboxUtilisation de Foreach
Plus de sujets relatifs à : Utilisation de sed


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR