effacer une valeur dans une collection de fichiers unix

effacer une valeur dans une collection de fichiers unix - Shell/Batch - Programmation

Marsh Posté le 20-07-2006 à 08:37:13    

Bonjour,
Je souhaiterais effacer une valeur donnée dans un ensemble de fichiers unix.
J'ai pensé à sed -e "s/toto//g" FICHIERS mais le retour chariot de fin de ligne n'est pas effacé. Y aurait-il moyen de corriger çà?
mERCI

Reply

Marsh Posté le 20-07-2006 à 08:37:13   

Reply

Marsh Posté le 21-07-2006 à 13:03:16    

Tu devrais être un peu plus précis ... montrer le contenu d'un des fichiers actuellement et ce que tu aimerais en sortie.


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 21-07-2006 à 14:00:03    

par exemple un des fichiers contient:
21000
25630
25890
56897
...et je voudrais effacer 25890 dans tous les fichiers qui s'appellent ot*

Reply

Marsh Posté le 21-07-2006 à 14:14:50    

Tu peux le faire avec gawk/nawk par exemple. Méthode un peu "crade" passant par un fichier temporaire :
Je considère que toute la ligne commençant par 25890 est à supprimer par contre ...
 

for file in ot*
do
  nawk '$1 != "25890" { print $0 }' $file > $file.mod
  mv $file.mod $file
done


Si tu scriptes, tu peux passer la valeur à supprimer en paramètre si elle peut être différente :

for file in ot*
do
  nawk -v Var=$1 '$1 != Var { print $0 }' $file > $file.mod
  mv $file.mod $file
done


Et tant qu'à faire ne pas faire le traitement sur les fichiers qui ne comportent pas cette valeur :

for file in ot*
do
  grep "^$1" $file > /dev/null 2>&1
  [ $? -eq 0 ] && ( nawk -v Var=$1 '$1 != Var { print $0 }' $file > $file.mod ; mv $file.mod $file )
done


Message édité par Deadlock le 21-07-2006 à 14:15:46

---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 21-07-2006 à 14:22:41    

Tiens, j'ai pas d'Unix sous le coude pour tester, mais est-ce que ça marche, ça ?
 

find <repertoire> -name "ot*" -type f -exec grep -v 25890 {} > {}.tmp && mv {}.tmp {} \;

Reply

Marsh Posté le 21-07-2006 à 15:01:10    

Elmoricq a écrit :

Tiens, j'ai pas d'Unix sous le coude pour tester, mais est-ce que ça marche, ça ?
 

find <repertoire> -name "ot*" -type f -exec grep -v 25890 {} > {}.tmp && mv {}.tmp {} \;



 
Jolie commande. Je teste ça cet aprem et je reviens ici modifier mon post pour donner le résultat...
 
[edit] Raté. J'ai essayé "find .... grep ... > {}.tmp \;" et ça m'a donné un fichier "{}.tmp".
Probable que la redirection ">" est interceptée par le shell et que le find ne la reçoit pas. J'ai tenté "\>" mais j'ai eu le résultat du grep à l'écran. Ptet en essayant "-exec \( grep ..... && ..... \) \;" mais j'y ai pas pensé sur le moment...


Message édité par Sve@r le 21-07-2006 à 16:49:03
Reply

Marsh Posté le 22-07-2006 à 14:37:14    

C'était plus pour le fun qu'autre chose, mais merci d'avoir testé [:romf]

Reply

Marsh Posté le 24-07-2006 à 17:22:06    

richard3 a écrit :

par exemple un des fichiers contient:
21000
25630
25890
56897
...et je voudrais effacer 25890 dans tous les fichiers qui s'appellent ot*


 
 
en barbare* :
 

find /chemin -name "ot*" -type f -exec vi -c "g/25890/d|:wq" {} \;


 
/dw devrait fonctionner pour n'effacer que ce mot si il est en milieu de ligne en vrac parmis d'autres mots....
 
 
 
*=avec vi l'outil universel qui existe partout (mais rarement par defaut)


Message édité par francoispgp le 24-07-2006 à 17:29:24
Reply

Marsh Posté le 24-07-2006 à 17:46:30    

Oh mon Dieu, j'ai encore jamais utilisé vi en ligne de commande. [:nico0]
 
Mais j'avoue que c'est joli et moins torturé que ce que j'ai mis.
 
Sinon, si on a PERL sur sa machine (ce qui est très courant sans être universel comme vi), on peut aussi écrire :
 

find <rep> -name "ot*" -type f -exec perl -ni -e 'print $_ if not /25890/;' {} \;

Reply

Marsh Posté le 27-07-2006 à 19:00:23    

Elmoricq a écrit :

Mais j'avoue que c'est joli et moins torturé que ce que j'ai mis.


Je préfère largement ce que t'avais mis. vi est extrèmement lourd et long. Vaut mieux utiliser une bonne boucle incluant du sed, tr, cut, awk et autres outils analogues. Ce devrait être bien plus rapide...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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