303 votes

Changer plusieurs fichiers

La commande suivante modifie correctement le contenu de 2 fichiers.

 sed -i 's/abc/xyz/g' xaa1 xab1 
 

Mais ce que je dois faire est de modifier plusieurs fichiers de manière dynamique et je ne connais pas les noms de fichiers. Je veux écrire une commande qui lira tous les fichiers du répertoire actuel en commençant par xa* et sed devrait changer le contenu du fichier.

168voto

lenik Points 7247

Mieux encore:

 for i in xa*; do
    sed -i 's/asd/dfg/g' $i
done
 

car personne ne sait combien de fichiers sont présents et il est facile de dépasser les limites de la ligne de commande.

Voici ce qui se passe quand il y a trop de fichiers:

 # grep -c aaa *
-bash: /bin/grep: Argument list too long
# for i in *; do grep -c aaa $i; done
0
... (output skipped)
#
 

94voto

Raj Points 143

Vous pouvez utiliser grep et sed ensemble. Cela vous permet de rechercher des sous-répertoires de manière récursive.

 grep -r -l <old> * | xargs sed -i 's/<old>/<new>/g'

For grep:
-r recursively searches subdirectories 
-l prints file names that contain matches
 

37voto

funroll Points 4014

Ces commandes ne fonctionneront pas avec les valeurs par défaut sed fournies avec Mac OS X.

De man 1 sed :

 -i extension
             Edit files in-place, saving backups with the specified extension.  If a zero-length extension is given, no backup will be saved.  It is not recommended to give a zero-
             length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
 

A tenté

sed -i '.bak' 's/old/new/g' logfile*

et

for i in logfile*; do sed -i '.bak' 's/old/new/g' $i; done .

Les deux fonctionnent bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X