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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  effacer une valeur dans une collection de fichiers unix

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

effacer une valeur dans une collection de fichiers unix

n°1409894
richard3
Posté le 20-07-2006 à 08:37:13  profilanswer
 

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

mood
Publicité
Posté le 20-07-2006 à 08:37:13  profilanswer
 

n°1411036
Deadlock
Feck off, cup !
Posté le 21-07-2006 à 13:03:16  profilanswer
 

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.
n°1411094
richard3
Posté le 21-07-2006 à 14:00:03  profilanswer
 

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

n°1411103
Deadlock
Feck off, cup !
Posté le 21-07-2006 à 14:14:50  profilanswer
 

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.
n°1411106
Elmoricq
Modérateur
Posté le 21-07-2006 à 14:22:41  profilanswer
 

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 {} \;

n°1411133
Sve@r
Posté le 21-07-2006 à 15:01:10  profilanswer
 

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
n°1411430
Elmoricq
Modérateur
Posté le 22-07-2006 à 14:37:14  profilanswer
 

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

n°1412501
francoispg​p
Posté le 24-07-2006 à 17:22:06  profilanswer
 

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
n°1412539
Elmoricq
Modérateur
Posté le 24-07-2006 à 17:46:30  profilanswer
 

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/;' {} \;

n°1414874
Sve@r
Posté le 27-07-2006 à 19:00:23  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  effacer une valeur dans une collection de fichiers unix

 

Sujets relatifs
Comportement fichiers temporaires apres uploaduploadé pleins de fichiers en meme temps
Collection d'Objet en php + gérer ordre de fichiers sur le serveur ?Problème fichiers temporaires
requête sql sur fichiers dBase à partir d'excelOuverture de fichiers automatique après recherche !
[C] Boucle avec strcat pour créer plusieurs fichiers[PHP] Telechargement de plusieur fichiers d'un seul coup
[VBS] : comparaison de fichiers (ligne par ligne) 
Plus de sujets relatifs à : effacer une valeur dans une collection de fichiers unix


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR