|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
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 : 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 |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Utilise des groupes et desback-references.
Ton exemple devient alors : Code :
sed "s/\([^§]\)¤\([^§]\)/\1\\\¤\2/g" test.txt |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
merci beaucoup pour ton aide, ca marche impec !
|
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
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 |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Je vois.
Il suffit donc de faire : Code :
sed "s/\\(\\([^§]\\)¤\\(.\\)\\|\\(.\\)¤\\([^§]\\)\\)/\\2\\4\\\\¤\\3\\5/g" Ce qui donne après simplification : Code :
sed -r 's/([^§])¤(.)|(.)¤([^§])/\1\3\\¤\2\4/g' Code :
|
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
Encore une fois merci
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
|
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
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 :
|
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
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 |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
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 ? |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 21 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com