Quando su OSX, installo sempre la versione GNU sed tramite Homebrew, per evitare problemi negli script, perché la maggior parte degli script sono stati scritti per le versioni GNU sed.
brew install gnu-sed --with-default-names
Quindi il tuo BSD sed sarà sostituito da GNU sed.
In alternativa, puoi installare senza nomi-predefiniti, ma poi:
- Cambia il tuo
PATH
come indicato dopo l'installazione dignu-sed
- Controlla i tuoi script per scegliere tra
gsed
osed
a seconda del tuo sistema
Funziona con GNU sed, ma non su OS X:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
Funziona su OS X, ma non con GNU sed:
sed -i '' -e 's/foo/bar/' target.file
Su OS X tu
- non può usare
sed -i -e
poiché l'estensione del file di backup verrebbe impostata su-e
- non può usare
sed -i'' -e
per gli stessi motivi:ha bisogno di uno spazio tra-i
e''
.
Se vuoi davvero usare solo sed -i
nel modo 'facile', quanto segue FUNZIONA sia su GNU che su BSD/Mac sed
:
sed -i.bak 's/foo/bar/' filename
Nota la mancanza di spazio e il punto.
Prova:
# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
Ovviamente potresti semplicemente eliminare il .bak
file.
Come chiede Noufal Ibrahim, perché non puoi usare Perl? Qualsiasi Mac avrà Perl e ci sono pochissime distribuzioni Linux o BSD che non includono una versione di Perl nel sistema di base. Uno dei pochi ambienti che potrebbe effettivamente mancare di Perl sarebbe BusyBox (che funziona come GNU/Linux per -i
, tranne per il fatto che non è possibile specificare alcuna estensione di backup).
Come consiglia ismail,
Dato che perl è disponibile ovunque, faccio solo
perl -pi -e s,foo,bar,g target.file
e questa sembra una soluzione migliore in quasi tutti i casi rispetto a script, alias o altre soluzioni alternative per gestire l'incompatibilità fondamentale di sed -i
tra GNU/Linux e BSD/Mac.