GNU/Linux >> Znalost Linux >  >> Linux

sed příznak na místě, který funguje na Mac (BSD) i Linuxu

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 instalaci gnu-sed
  • Zkontrolujte své skripty a vyberte si mezi gsed nebo sed 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.


Linux
  1. Příkaz Linux Sed:Použití a příklady

  2. Jak vyprázdnit (zkrátit) soubor na linuxu, který již existuje a je nějakým způsobem chráněn?

  3. Příkaz sed s volbou -i selže na Macu, ale funguje na Linuxu

  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Rekurzivní vyhledávání a nahrazování v textových souborech na Macu a Linuxu

  3. Je možné, že linuxový deskriptor souboru 0 1 2 není pro stdin, stdout a stderr?

  1. Linux .htaccess tipy a triky

  2. Podporované a doporučené souborové systémy v systému Linux

  3. Příklady příkazů sed v Linuxu