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 09/02/2011, 20h31   #1
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
Par défaut Aller un peu plus loin avec sed..

Bonsoir à tous!
Après pas mal de docs sur sed je commence à comprendre plus ou moins:
J'ai un fichier toto.txt:
Code :
1
2
3
AZERTY QWERTY
AZERTY QWERTY
AZERTY QWERTY
j'ai un fichier titi.txt:

Code :
1
2
3
QWERTY AZERTY 
QWERTY AZERTY 
QWERTY AZERTY
je lance ma commande:
Code :
sed -i 's/ //g' [FIC] | tr -d '\n' > test.txt
Le résultat est le suivant :
Code :
AZERTYQWERTYAZERTYQWERTYAZERTYQWERTYQWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
Le problème c'est qu'il me colle tout , moi je voudrais avoir plutôt ça:
Code :
1
2
AZERTYQWERTYAZERTYQWERTYAZERTYQWERTY
QWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
OS: Solaris ( UNIX ksh)
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 21h05   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 146
Points : 4 146
Bonjour,

Code :
1
2
3
sed -s ':flag;N;s/ \|\n//g;bflag' toto.txt titi.txt
AZERTYQWERTYAZERTYQWERTYAZERTYQWERTY
QWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
fonctionne avec GNU sed, peut-être pas avec un autre
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 21h17   #3
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
Je vais éssayer

Par contre le sed :'flag;N;s/\n/ /;bflag' [ FIC ] ne fonctionne pas sur Sun
alors je sais pas si celle la va fonctionner ;-(
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 07h43   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Essaye en séparant chaque instruction avec l'option "-e" et en ne mettant qu'une seule lettre comme étiquette (certaines versions de Sed sont sensibles au nombre de lettres dans une étiquette) :

Code :
sed -s -e ':z' -e 'N' -e 's/ \|\n//g' -e 'bz' fichier1 fichier2
Essaye aussi en mettant les instructions dans un fichier et en appelant ledit fichier :

Code :
1
2
3
4
5
6
7
cat script.sed
:z
N
s/ \|\n//g
b z

sed -s -f script.sed fich1 fich2
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2011, 09h01   #5
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
Aucune des commandes ne marchent sur mon SUN
aucun résultat ou message d'erreur type sed: command garbled
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h19   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Alors essaye comme ça :

Code :
sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
En respectant les espaces après chaque point-virgule...
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h29   #7
Membre habitué
 
Avatar de nowahn
 
Homme
Inscription : août 2008
Messages : 77
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2008
Messages : 77
Points : 131
Points : 131
Bonjour,

L’option -s de sed semble être une extension GNU.
Tu peux t’en passer en faisant une commande par fichier :
Code bash :
1
2
3
SedCommand=':flag;N;s/ \|\n//g;bflag'
sed "${SedCommand}" toto.txt > test.txt
sed "${SedCommand}" titi.txt >> test.txt
ou quelque chose du genre :
Code bash :
1
2
SedCommand=':flag;N;s/ \|\n//g;bflag'
(sed "${SedCommand}" toto.txt ; sed "${SedCommand}" titi.txt) > test.txt
nowahn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h30   #8
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
Code :
1
2
3
4
5
sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
sed: illegal option -- s
 
sed -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
Label too long: :z; N; s/ \|\n//g; bz
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h43   #9
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
marche pas non plus

cela ne m'enlève pas les retours chariots
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 10h24   #10
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
C'est bon j'ai trouvé l'astuce avec l'aide d'un collègue
je vous l'écrit ce soir
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h35   #11
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par ghostrider95 Voir le message
sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
sed: illegal option -- s

sed -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
Label too long: :z; N; s/ \|\n//g; bz

Comme indiqué par zipe31, il faut sortir le :z

Code :
sed -e ':z' -e'N' -e's/ \|\n//g' -e 'bz'
mais bon, ça t'arrange pas vu que tu veux une seule commande sans boucle j'imagine
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h44   #12
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par Alek-C Voir le message
Membre éclairé

Il faut sortir le :z

Code :
sed -e ':z' -e'N' -e's/ \|\n//g' -e 'bz'
Tu ne devais pas être bien éclairé
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h49   #13
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par zipe31 Voir le message
Salut,
Tu ne devais pas être bien éclairé
Sisi, mais dans les exemples de ghostrider95, il n'avait pas suivi tes recommandations, donc j'en remettais une couche (mais il est vrai que j'ai oublié de te citer c'est réparé, toutes mes excuses !)

Sinon, j'ai une solution avec awk je pense :
Code :
awk 'NR==1 {printf "%s",$0} NR!=1&&FNR==1 {printf "\n%s",$0 } FNR!=1 {printf "%s",$0} END {printf "\n"}' *.txt
le premier print et le dernier sont plus là pour faire joli qu'autre chose (sans eux, il y a respectivement une ligne blanche au début et pas de saut de ligne à la fin)...

Ca devrait marcher partout non ?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h03   #14
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par Alek-C Voir le message
Sisi, mais dans les exemples de ghostrider95, il n'avait pas suivi tes recommandations, donc j'en remettais une couche (mais il est vrai que j'ai oublié de te citer c'est réparé, toutes mes excuses !)
Mais je vous en prie, mais ce n'était pas souligné dans ce sens là

Sinon, avec "sed" et sans boucle, on peut utiliser les mémoires principales et secondaires....

Code :
sed -n -e 1h -e '1!H' -e '${x;s/\n/ /gp;}'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h28   #15
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
ça marche pas ça si ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~
$ cat toto.txt
QWERTY AZERTY
QWERTY AZERTY
QWERTY AZERTY
toto
~
$ cat titi.txt
AZERTY QWERTY
AZERTY QWERTY
AZERTY QWERTY
titi
~
$ sed -n -e 1h -e '1!H' -e '${x;s/\n/ /gp;}' *.txt
AZERTY QWERTY AZERTY QWERTY AZERTY QWERTY titi QWERTY AZERTY  QWERTY AZERTY  QWERTY AZERTY toto
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h34   #16
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ben non, pas sur plusieurs fichiers, à moins de rajouter l'option "-s", mais comme notre ami n'a pas cette option dans sa version de "sed", je n'en ai pas parlé
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 09h16   #17
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
on est d'accord

cela étant, on a toujours pas la solution qu'il a trouvé avec son collègue !
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 19h53   #18
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 130
Points : 29
Points : 29
Bonsoir!
Désolé du retard

Voici la solution de mon collègue qui fonctionne sous mon SunOS:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#############################################
 
FIC=/chemin/t*
# chemin ou sont stockés "mes fichiers" toto.txt et titi.txt
FIC2=/chemin/new_fichier
 
#Initialise le fichier $FIC2 vide
> $FIC2
 
 
 
for fic in $(ls -1 $FIC)
do
  sed 's/ //g' $fic | tr -d '\n' >> $FIC2
  echo  >> $FIC2
 
done
ghostrider95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 20h09   #19
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Merci pour le complément d'info.

Par contre ce n'est pas trop en adéquation avec ton titre et tu n'es guère plus avancé qu'en arrivant
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 17h42   #20
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Ben à priori, il n'existe pas de moyen pour faire ça dans sed sous SunOS vu qu'il manque des options

Sinon, et comme dirait N_BaH, on ne fait pas for item in $(command); surtout pas ls. parce que
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h33.


 
 
 
 
Partenaires

Hébergement Web