Je dois faire un regex rechercher et remplacer sur tous les fichiers dans un dossier (et ses sous-dossiers). Quelle serait la commande du shell Linux pour faire cela?
Par exemple, je veux exécuter ceci sur tous les fichiers et écraser l'ancien fichier avec le nouveau texte remplacé.
sed 's/old text/new text/g'
Réponses:
Il n'y a aucun moyen de le faire en utilisant uniquement sed. Vous devrez utiliser au moins l'utilitaire de recherche ensemble:
Cette commande créera un
.bak
fichier pour chaque fichier modifié.Remarques:
-i
argument de lased
commande est une extension GNU, donc, si vous exécutez cette commande avec le BSD,sed
vous devrez rediriger la sortie vers un nouveau fichier puis le renommer.find
utilitaire n'implémente pas l'-exec
argument dans les anciennes boîtes UNIX, vous devrez donc utiliser un| xargs
.la source
\;
?-i
en soi, ne crée pas de fichier de sauvegarde, et c'est ce qui pousse sed à effectuer l'opération sur le fichier en place.{}
?{}
sera remplacé par chaque nom de fichier trouvé parfind
et\;
indique de trouver que la commande dont il a besoin pour exécuter se termine à ce stade.Je préfère utiliser
find | xargs cmd
plusfind -exec
parce que c'est plus facile à retenir.Cet exemple remplace globalement «foo» par «bar» dans les fichiers .txt au niveau ou en dessous de votre répertoire actuel:
Les options
-print0
et-0
peuvent être omises si vos noms de fichiers ne contiennent pas de caractères géniaux tels que des espaces.la source
find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' "s/foo/bar/g"
(notez en fournissant une chaîne vide à l'-i
argument).Pour la portabilité, je ne me fie pas aux fonctionnalités de sed spécifiques à Linux ou BSD. J'utilise plutôt le
overwrite
script du livre de Kernighan et Pike sur l'environnement de programmation Unix.La commande est alors
Et le
overwrite
script (que j'utilise partout) estL'idée est qu'elle écrase un fichier uniquement si une commande réussit. Utile dans
find
et également là où vous ne voudriez pas utilisercar le shell tronque le fichier avant de
sed
pouvoir le lire.la source
Puis-je suggérer (après avoir sauvegardé vos fichiers):
la source
Exemple: remplacez {AutoStart} par 1 pour tous les fichiers ini sous le dossier / app / config / et ses dossiers enfants:
la source
la source
Pourrait vouloir essayer mon script Perl de recherche / remplacement de masse . Présente certains avantages par rapport aux solutions d'utilité chaînée (comme ne pas avoir à gérer plusieurs niveaux d'interprétation des métacaractères du shell).
la source
Dans le cas où le nom des fichiers dans le dossier a des noms réguliers (comme fichier1, fichier2 ...), j'ai utilisé pour cycle.
la source