sed

sed - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 12-09-2004 à 13:09:33    

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.

Reply

Marsh Posté le 12-09-2004 à 13:09:33   

Reply

Marsh Posté le 12-09-2004 à 17:41:57    

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

Reply

Marsh Posté le 12-09-2004 à 19:06:54    

find avec des exec?

Reply

Marsh Posté le 12-09-2004 à 19:17:02    

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


---------------
Dommage :-) | chess games
Reply

Marsh Posté le 12-09-2004 à 19:20:16    

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]

Reply

Marsh Posté le 12-09-2004 à 19:23:02    


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
Reply

Marsh Posté le 12-09-2004 à 19:24:00    

ok :D
 
 

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

 woody powa  [:yaisse]  

Reply

Marsh Posté le 12-09-2004 à 20:08:25    

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  :-)

Reply

Marsh Posté le 19-09-2004 à 13:10:05    

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
Reply

Marsh Posté le 19-09-2004 à 16:27:28    


#!/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

Reply

Marsh Posté le 19-09-2004 à 16:27:28   

Reply

Marsh Posté le 19-09-2004 à 17:38:11    

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

Reply

Marsh Posté le 20-09-2004 à 10:08:27    

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

Reply

Marsh Posté le 21-09-2004 à 19:53:50    

>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"

Reply

Marsh Posté le 22-09-2004 à 11:20:49    

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'

Reply

Marsh Posté le 22-09-2004 à 20:08:39    

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

Reply

Marsh Posté le 23-09-2004 à 13:08:37    

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".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed