Pour le mac, une approche plus similaire serait celle-ci :
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Comme solution alternative, j'utilise celle-ci sur Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
Le crédit revient à :la réponse de Todd Cesere
OS X utilise un mélange d'outils BSD et GNU, il est donc préférable de toujours vérifier la documentation (même si je l'avais less
n'était même pas conforme à la page de manuel d'OS X) :
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed prend l'argument après -i
comme extension pour les sauvegardes. Fournissez une chaîne vide (-i ''
) pour aucune sauvegarde.
Ce qui suit devrait faire :
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
Le -type f
est juste une bonne pratique ; sed se plaindra si vous lui donnez un répertoire ou autre.
-exec
est préféré à xargs
; vous n'avez pas besoin de vous embêter avec -print0
ou quoi que ce soit.
Le {} +
à la fin signifie que find
ajoutera tous les résultats en tant qu'arguments à une instance de la commande appelée, au lieu de la réexécuter pour chaque résultat. (Une exception est lorsque le nombre maximal d'arguments de ligne de commande autorisés par le système d'exploitation est dépassé ; dans ce cas, find
exécutera plus d'une instance.)
Si vous obtenez une erreur telle que "séquence d'octets non valide", il peut être utile de forcer les paramètres régionaux standard en ajoutant LC_ALL=C
au début de la commande, comme ceci :
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +