Per il mac, un approccio più simile sarebbe questo:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Come soluzione alternativa, sto usando questa su Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
Il merito va a:la risposta di Todd Cesere
OS X utilizza un mix di strumenti BSD e GNU, quindi è meglio controllare sempre la documentazione (anche se avevo quel less
non era nemmeno conforme alla manpage di OS X):
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed prende l'argomento dopo -i
come estensione per i backup. Fornisci una stringa vuota (-i ''
) per nessun backup.
Dovrebbe fare quanto segue:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
Il -type f
è solo una buona pratica; sed si lamenterà se gli dai una directory o giù di lì.
-exec
è preferito a xargs
; non devi preoccuparti di -print0
o altro.
L'{} +
alla fine significa che find
aggiungerà tutti i risultati come argomenti a un'istanza del comando chiamato, invece di rieseguirlo per ogni risultato. (Un'eccezione è quando viene violato il numero massimo di argomenti della riga di comando consentiti dal sistema operativo; in tal caso find
eseguirà più di un'istanza.)
Se ricevi un errore come "sequenza di byte non valida", potrebbe essere utile forzare la localizzazione standard aggiungendo LC_ALL=C
all'inizio del comando, in questo modo:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +