Když jsem na OSX, vždy instaluji verzi GNU sed přes Homebrew, abych se vyhnul problémům se skripty, protože většina skriptů byla napsána pro verze GNU sed.
brew install gnu-sed --with-default-names
Potom bude váš BSD sed nahrazen GNU sed.
Případně můžete nainstalovat bez výchozích názvů, ale pak:
- Změňte
PATH
podle pokynů po instalacignu-sed
- Zkontrolujte své skripty a vyberte si mezi
gsed
nebosed
v závislosti na vašem systému
Toto funguje s GNU sed, ale ne na OS X:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
Toto funguje na OS X, ale ne s GNU sed:
sed -i '' -e 's/foo/bar/' target.file
V systému OS X jste
- nelze použít
sed -i -e
protože přípona záložního souboru by byla nastavena na-e
- nelze použít
sed -i'' -e
ze stejných důvodů — potřebuje mezeru mezi-i
a''
.
Pokud opravdu chcete použít pouze sed -i
'snadným' způsobem, následující FUNGUJE na GNU i BSD/Mac sed
:
sed -i.bak 's/foo/bar/' filename
Všimněte si nedostatku místa a tečky.
Důkaz:
# 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
Je zřejmé, že pak stačí odstranit .bak
soubory.
Jak se ptá Noufal Ibrahim, proč nemůžete použít Perl? Každý Mac bude mít Perl a existuje jen velmi málo distribucí Linuxu nebo BSD, které neobsahují nějakou verzi Perlu v základním systému. Jedním z mála prostředí, které by mohlo ve skutečnosti postrádat Perl, by byl BusyBox (který funguje jako GNU/Linux pro -i
, kromě toho, že nelze zadat žádné rozšíření zálohy).
Jak ismail doporučuje,
Protože je perl dostupný všude, udělám jen
perl -pi -e s,foo,bar,g target.file
a to se zdá být téměř v každém případě lepším řešením než skripty, aliasy nebo jiná řešení pro řešení základní nekompatibility sed -i
mezi GNU/Linux a BSD/Mac.