Pro Mac by byl podobný přístup tento:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Jako alternativní řešení používám toto na Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
Poděkování patří:Odpověď Todda Cesere
OS X používá kombinaci nástrojů BSD a GNU, takže je nejlepší vždy zkontrolovat dokumentaci (i když jsem to měl takto less
neodpovídal ani manuálové stránce OS X):
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed přebírá argument po -i
jako rozšíření pro zálohy. Zadejte prázdný řetězec (-i ''
) bez zálohování.
Mělo by fungovat následující:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
je jen dobrá praxe; sed si bude stěžovat, pokud mu dáte adresář nebo tak.
-exec
je preferován před xargs
; nemusíte se obtěžovat s -print0
nebo cokoli.
{} +
na konci znamená, že find
připojí všechny výsledky jako argumenty k jedné instanci volaného příkazu, místo aby jej znovu spouštěl pro každý výsledek. (Jednou výjimkou je případ, kdy je porušen maximální počet argumentů příkazového řádku povolený operačním systémem; v takovém případě find
spustí více než jednu instanci.)
Pokud se zobrazí chyba jako „neplatná sekvence bajtů“, může pomoci vynutit standardní národní prostředí přidáním LC_ALL=C
na začátku příkazu, například takto:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +