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 06/07/2007, 17h10   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
Par défaut Utilisation de la commande sed

Bonjour bonjour.
Ma question va surement paraitre idiote pour beaucoup mais la voici.

Je dois remplacer dans un fichier tous les caractère ¤ qui ne sont pas compris entre des § par des \¤.
exemple :
ab¤cd deviendra ab\¤cd
ab§¤§cd restera tel quel

Voici la commande que j'utilise pour l'instant :
Code :
 sed "s/[^§]¤[^§]/\\\¤/g" test.txt
Seul problème, je perds les anciens caractères (celui d'avant et d'après)
exemple : ab¤cd devient a\¤d au lieu de ab\¤cd

Comment faire pour remettre les anciens caractères ?

Merci d'avance
kast_or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2007, 17h43   #2
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Utilise des groupes et desback-references.
Ton exemple devient alors :
Code :
sed "s/\([^§]\)¤\([^§]\)/\1\\\¤\2/g" test.txt
(non testé)
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 08h37   #3
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
merci beaucoup pour ton aide, ca marche impec !
kast_or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 09h15   #4
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
Encore une petite question pour la route alors, vu que t'es chaud

Comment faire maintenant pour qu'il me remplace les §¤ par des §\¤ et les ¤§ par des \¤§ et tout ca avec une seule ligne sed ?

parceque pour l'instant il ne les remplace pas a cause des [^§]..[^§]

Merci d'avance
kast_or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 12h24   #5
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Je vois.

Il suffit donc de faire :
Code :
sed "s/\\(\\([^§]\\)¤\\(.\\)\\|\\(.\\)¤\\([^§]\\)\\)/\\2\\4\\\\¤\\3\\5/g"
Comment ça, le code sed n'est pas lisible ? C'est pour ça que des gens ont inventé le quoting et les regexps étendues.
Ce qui donne après simplification :
Code :
sed -r 's/([^§])¤(.)|(.)¤([^§])/\1\3\\¤\2\4/g'
Par exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$ cat tmp
ab¤cd
ab§¤§cd
ab¤§cd
ab§¤cd
$ sed -r 's/([^§])¤(.)|(.)¤([^§])/\1\3\\¤\2\4/g' < tmp
ab\¤cd
ab§¤§cd
ab\¤§cd
ab§\¤d
C'est bien ce que tu voulais ?
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 14h52   #6
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
Encore une fois merci . J'aurai du y penser.
Aller, encore une question pour la route vu que t es le roi des expressions :

comment on fait quand il y a plus de 9 "paramètres" entre parenthès ?
c'est a dire que pour le dixième, si je mets \10 il me marque le premier paramètre puis le 0 (du dix). Je sais pas si c'est très clair.

En fait, j'ai combiné ce traitement avec un autre qui faisait paramètre mais avec d'autre lettres :
exemple :
aba --> aba
abc --> a\bc
cba --> c\ba
cbd --> c\bd

pareil avec les e et f :
efe --> efe
efg --> e\fg
gfe --> g\fe
gfh --> g\fh

tu vois le genre

voici l'expression que j'utilise :

Code :
sed -r 's/([^a])(b)(.)|(.)(b)([^a])|([^e])(f)(.)|(.)(f)([^e])/\1\4\7\10\\\2\5\8\11\3\6\9\12/g' test.txt
Si t y arrives t'es le roi
kast_or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 15h49   #7
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
D'autant que je sache, on est limité à 9 avec gnu Sed. Il y a peut-être d'autres versions de Sed qui permettent ça, mais on peut souvent s'en passer.

Code :
sed -r -e 's/([^a])b(.)|(.)b([^a])/\1\3\\b\2\4/' -e s/([^e])f(.)|(.)f([^e])/\1\3\\f\2\4/'
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat tmp
aba
abc
cba
cbd
efe
efg
gfe
gfh
$ sed -re 's/([^a])b(.)|(.)b([^a])/\1\3\\b\2\4/' -e 's/([^e])f(.)|(.)f([^e])/\1\3\\f\2\4/' < tmp
aba
a\bc
c\ba
c\bd
efe
e\fg
g\fe
g\fh
$
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 15h56   #8
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
Et cette commande va plus vite que deux sed a la suite ou ca n'y change rien ?
Sinon je préfère le laissé en deux passes séparées

Encore merci pour ton aide précieux
kast_or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 16h01   #9
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Les deux commandes sont exécutées l'une après l'autre, dans la même passe. Le flux est donc lu qu'une seule fois. Niveau rapidité, c'est donc correct (ok, Sed n'est jamais super rapide, mais c'est correct). Je suis presque sûr que cette version en 2 commandes est plus rapide que ta tentative : les regexps séparées sont plus simples à parser.

Ce sera tout ?
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2007, 09h03   #10
Invité de passage
 
Inscription : novembre 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 21
Points : 4
Points : 4
Re bonjour.

Juste pour info LLB, j'ai essayé les deux méthodes :
- 5 traitements avec 5 seds différents
- 5 traitements en une seule commande sed

Le résultat est pratiquement identique sur un fichier de plus de 300 mo (même un léger gain de temps avec 5sed)
J'ai donc gardé cette dernière pour des questions de lisibilité.

Encore merci pour ton aide
kast_or 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 20h11.


 
 
 
 
Partenaires

Hébergement Web