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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

sed

n°555860
Incarnatio​n
Posté le 12-09-2004 à 13:09:33  profilanswer
 

Bonjour à tous,
 
 
Pour traiter une série de fichier, j'utilise ceci :

Code :
  1. for i in ls;
  2. do;
  3.   sed "/regexp/d" $i > $i.tmp;
  4.   mv -f $i.tmp $i;
  5. done

Existe t il un moyen plus élégant ?
 
 
Merci d'avance.

mood
Publicité
Posté le 12-09-2004 à 13:09:33  profilanswer
 

n°555931
Zaib3k
Posté le 12-09-2004 à 17:41:57  profilanswer
 

heu ... en remplacant ls par *
 
:D sinon je ne vois pas de dechets dans ton code.

n°555976
burgergold
5$? va chez l'diable!
Posté le 12-09-2004 à 19:06:54  profilanswer
 

find avec des exec?

n°555987
freyr
Posté le 12-09-2004 à 19:17:02  profilanswer
 

l'options -i pour sed permet d'editer directement les fichiers. pas besoin de passer par des fichiers temporaire


---------------
Dommage :-) | chess games
n°555990
Zaib3k
Posté le 12-09-2004 à 19:20:16  profilanswer
 

freyr a écrit :

l'options -i pour sed permet d'editer directement les fichiers. pas besoin de passer par des fichiers temporaire


 
j'ai pas cette option ds mon man
 
mais si elle existe ca simplifie drolement:
 

sed "/regexp/d" *


 
 [:yaisse]

n°555994
freyr
Posté le 12-09-2004 à 19:23:02  profilanswer
 


GNU sed version 4.1.2
Copyright (C) 2003 Free Software Foundation, Inc.
 
 
 
  -i[SUFFIX], --in-place[=SUFFIX]
              edit files in place (makes backup if extension supplied)
 


---------------
Dommage :-) | chess games
n°555995
Zaib3k
Posté le 12-09-2004 à 19:24:00  profilanswer
 

ok :D
 
 

GNU sed version 3.02
 
Copyright (C) 1998 Free Software Foundation, Inc.

 woody powa  [:yaisse]  

n°556015
Incarnatio​n
Posté le 12-09-2004 à 20:08:25  profilanswer
 

freyr a écrit :

l'options -i pour sed permet d'editer directement les fichiers. pas besoin de passer par des fichiers temporaire

Fantastique, ça marche nickel  :-)

n°559071
Incarnatio​n
Posté le 19-09-2004 à 13:10:05  profilanswer
 

Je reviens vers vous pour un chtit problème.
Je veux supprimer de mes e-mails archivés les headers suivants :

X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=0.92.6
X-Bogosity: Spam, tests=bogofilter, spamicity=1.000000, version=0.92.6
X-Bogosity: Unsure, tests=bogofilter, spamicity=0.881952, version=0.92.6

Comme vous pouvez le voir, la valeur de la variable spamicity est un chiffre à virgule et six décimales.
 
J'ai donc fait ce script mais excepté l'affichage des echo, cela n'a aucun effet :

Code :
  1. #!/bin/bash
  2. echo
  3. echo "Suppression des headers Bogofilter..."
  4. echo
  5. for i in `ls`
  6. do
  7.   sed -i "/^X-Bogosity: (Ham|Spam|Unsure)\, tests=bogofilter\, spamicity=(0|1)\.[[:digit:]]{6}\, version=0\.92\.6$/d" $i
  8. done
  9. exit 0

Pouvez-vous m'aider ?


Message édité par Incarnation le 19-09-2004 à 13:19:16
n°559167
BMOTheKill​er
Posté le 19-09-2004 à 16:27:28  profilanswer
 


#!/bin/bash
 
echo
echo "Suppression des headers Bogofilter..."
echo
sed -i '/^X-Bogosity.*/d' *
exit 0


 
^ = ancrage début de ligne
.* = 0 ou N caractères suivants sur la ligne
* = mouliner tous les fichiers du répertoire

mood
Publicité
Posté le 19-09-2004 à 16:27:28  profilanswer
 

n°559205
Incarnatio​n
Posté le 19-09-2004 à 17:38:11  profilanswer
 

>BMOTheKiller
 
D'accord cela marche, mais mon but est aussi d'apprendre à utiliser les regexp et donc de comprendre pourquoi cela ne fonctionne pas...

n°559428
fguilleme
Posté le 20-09-2004 à 10:08:27  profilanswer
 

tu dois escaper ton {6} => \{6\}
et les | => \|
et les () => \(\)

n°560168
Incarnatio​n
Posté le 21-09-2004 à 19:53:50  profilanswer
 

>fguilleme
 
Terrible  :-)
 
Mais pourquoi faut-il échapper les méta caractères "()|{}" ?
Il me semble que l'on ne doit faire cela que si l'on souhaite les considérer comme faisant partie de la chaîne à matcher, non ?
 
Par ailleurs, pourquoi ceci marche t il :

Code :
  1. sed "/^X-Bogosity: [Ham|Spam|Unsure]/d"

Et non cela :

Code :
  1. sed "/^X-Bogosity: [Ham|Spam|Unsure],/d"

n°560375
fguilleme
Posté le 22-09-2004 à 11:20:49  profilanswer
 

Dans ta ligne tu utilises des double quotes.
Ça veut dire que le shell va faires ses substitutions d'abord et interpréter certains caractères.
change les en simple quotes et essaie.  
sed '/^X-Bogosity: [Ham|Spam|Unsure],/d'

n°560646
Incarnatio​n
Posté le 22-09-2004 à 20:08:39  profilanswer
 

>fguilleme
>sed '/^X-Bogosity: [Ham|Spam|Unsure],/d'
 
Marche pas  :-(

n°560891
Toucouch
Posté le 23-09-2004 à 13:08:37  profilanswer
 

Essaie plutôt:

Code :
  1. sed '/^X-Bogosity: \(Ham\|Spam\|Unsure\),/d'


 
Les crochets sont utilisés pour les ensemble de caractères. Ta regex voulait dire "Toute ligne débutant par 'X-Bogosity: ', suivi d'un caractère parmi 'H', 'a', 'm', '|', 'S', 'p', 'U','n', 's', 'u', 'r', 'e', puis suivi d'une virgule".


Aller à :
Ajouter une réponse
 

Sujets relatifs
Plus de sujets relatifs à : sed


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)