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 13/12/2007, 14h38   #1
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Par défaut Insertion de retour chariots avec sed

Bonjour,

J'ai un petit probleme avec une commande SED. Le but est de faire une recherche de regexp et d'inserer un retour à la ligne a des endroits bien precis.
J'ai trouver comment faire avec sed en ligne de commande :

Fichier test :
SED en ligne de commande :
Avec ^J qui s'obtient en fesant <ctrl><V> + <ctrl><J>

Cette commande remplace l'espace par un retour à la ligne afin d'obtenir :
Le problème est que lorsque j'essais de scripter cette commande dans un KSH, le ^J est remplacer par un retour à la ligne dans le KSH ce qui provoque une erreur de syntaxe.

Je suis sous KSH (AIX 5.2)

Merci d'avance pour votre aide.
A+
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 15h47   #2
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 310
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 310
Points : 8 592
Points : 8 592
Essaie voir un truc comme ça :
Code :
1
2
3
4
#!/bin/ksh
 
sed 's/ /
/g' test
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 15h54   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Comme ça peut-être :
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 13h21   #4
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Merci mais ca ne marche pas. La solution proposée par _Mac_ provoque une erreur de parsing.
Est ce que sed fonctionne en lui indiquant les codes Hexa des caracteres que l'on veut remplacer ? J'ai essayé avec une syntaxe x10 mais ça ne fonctionne pas
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 14h03   #5
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
Code :
sed "s+ +\n+g" fichier > sortie
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 14h53   #6
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Ca ne fonctionne pas :
Code :
1
2
$ echo "Test Test" | sed 's+ +\n+g'
TestnTest
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 17h07   #7
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
Code :
echo "Test Test" | sed 'y, ,\n,'
Ce qui en fait revient à faire un tr.
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 18h39   #8
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Citation:
Envoyé par Pouic Voir le message
Code :
echo "Test Test" | sed 'y, ,\n,'
Ce qui en fait revient à faire un tr.
Tout a fait d'accord, mais je ce n'est qu'un exemple. J'ai simplifier le probleme afin d'exposer mon probleme.

Je veut en fait faire un truc du genre remplacer l'espace par un retour à la ligne uniquement lorsque l'espace est suivi de "MOT" :
Code :
Test Test MOT Test TEst
Donnera :
Code :
1
2
Test Test
MOT Test TEst
A+
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 22h11   #9
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
fic.sed
Citation:
# fic.sed
s, \(MOT\),\
\1,g

Code :
1
2
3
$ echo "Test Test MOT Test TEst" | sed -f fic.sed 
Test Test
MOT Test TEst
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2007, 02h08   #10
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
Citation:
Envoyé par zoullou Voir le message
Ca ne fonctionne pas :
Code :
1
2
$ echo "Test Test" | sed 's+ +\n+g'
TestnTest
je te signale que j'ai mis des GUILLEMETS " " PAS des apostrophes ' ' ...

Code :
sed "s+ +\n+g" fichier > sortie
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 14h42   #11
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Salut

@souviron34 : Ca ne fonctionne pas
Code :
1
2
$ echo "Test Test" | sed "s+ +\n+g"
TestnTest
@Pouic : Ca fonctionne, mais ça impose d'avoir un fichier en plus, je ne peut pas scripter mon traitement avec un seul script

A+
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 04h12   #12
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
chez moi ceci fonctionne :

fichier toto;txt

Code :
ceci est un texte long qui sera découpé en un mot par ligne

Avec

Code :
sed "s+ +\n+g" toto.txt > sortie.txt
j'obtiens :

sortie.txt

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
ceci
est
un
texte
long
qui
sera
découpé
en
un
mot
par
ligne
Par contre pour le faire directement dans la ligne, je ne sais pas..

Si, testé même sur Windows avec cygwin et Linux avec Redhat (via bash) :

Code :
1
2
3
4
5
6
7
8
$ echo "ceci est un texte long qui sera coupe" | sed "s+ +\n+g"
ceci
est
un
texte
qui
sera
coupe
tu fonctionnes sur quel shell ? sh ou ksh ou csh ou bash ?
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 08h48   #13
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
@ Souviron : j'ai testé ta solution sous un linux avec bash pour voir : effectivement ça fonctionne. Mais sous OS X avec bash, non.
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 12h31   #14
Membre du Club
 
Avatar de zoullou
 
Inscription : janvier 2003
Messages : 130
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 130
Points : 67
Points : 67
Je suis sous KSH (AIX) et ça ne fonctionne pas. Ca doit etre une vieille version de sed
zoullou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 13h20   #15
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
il y a 2 possibilités de différence : ou c'est le shell ou c'est le sed.

a) Regarder la doc de sed sur le système en question et voir.
b) Regarder la doc du shell utilisé et voir

J'aurais tendance à dire que c'est le shell, qui doit interprétrer le \n pour autre chose (à moins que Pouic ait essayé avec ksh aussi)



en écrivant ça.. Bon sang mais c'est bien sûr.... Comme le montre ta sortie d'ailleurs....

C'est le caractère \ ...

Je ne sais plus si il faut le doubler \\ ou le mettre entre quote pour qu'il reste avec les shells style ksh...



Trouve ce qu'il faut pour que le shell n'interprête pas le \ et essaye et ça devrait marcher

__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 16h45   #16
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
Citation:
Envoyé par souviron34 Voir le message
J'aurais tendance à dire que c'est le shell, qui doit interprétrer le \n pour autre chose (à moins que Pouic ait essayé avec ksh aussi)
Oui, j'avais essayé avec ksh aussi sous Mac, ça ne fonctionnait pas.

Je pense que le problème vient du fait que sous Linux, en général, c'est GNU Sed qui est installé, alors que sous *BSD, AIX, et compagnie, c'est le sed pas GNU qui tourne
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 16h59   #17
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
Personellement j'essaierais qund meme ceci :

Citation:
Envoyé par souviron34 Voir le message
C'est le caractère \ ...

Je ne sais plus si il faut le doubler \\ ou le mettre entre quote pour qu'il reste avec les shells style ksh...

Trouve ce qu'il faut pour que le shell n'interprête pas le \ et essaye et ça devrait marcher

car dans sa sortie il y a bien n entre Test et Test.

Donc c'est le / qui a disparu ...

Et vu la caractere () particulier du caractere il doit bien y avoir une maniere de passer une escape sequence sans qu'elle soit interpretee (je suis pas mal rouille (et je n'en ai pas sous la main)) pour sh et ksh et csh

(effectivement sur Linux que ce soit sh ksh csh ou bash ca marche)
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 22h06   #18
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
compte-tenu de la reponse de frp31 ici , ce serait donc :

Code :
$ echo "ceci est un texte long qui sera coupe" | sed "s+ +\\\n+g"
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h32.


 
 
 
 
Partenaires

Hébergement Web