effacer une valeur dans une collection de fichiers unix - Shell/Batch - Programmation
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.
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*
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* |
Si tu scriptes, tu peux passer la valeur à supprimer en paramètre si elle peut être différente :
for file in ot* |
Et tant qu'à faire ne pas faire le traitement sur les fichiers qui ne comportent pas cette valeur :
for file in ot* |
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 {} \; |
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 ?
|
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...
Marsh Posté le 22-07-2006 à 14:37:14
C'était plus pour le fun qu'autre chose, mais merci d'avoir testé
Marsh Posté le 24-07-2006 à 17:22:06
richard3 a écrit : par exemple un des fichiers contient: |
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)
Marsh Posté le 24-07-2006 à 17:46:30
Oh mon Dieu, j'ai encore jamais utilisé vi en ligne de commande.
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/;' {} \; |
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...
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