GNU/Linux >> Linux Esercitazione >  >> Linux

sed flag sul posto che funziona sia su Mac (BSD) che su Linux

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 di gnu-sed
  • Controlla i tuoi script per scegliere tra gsed o sed 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.


Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. File system supportati e consigliati su Linux

  3. Come svuotare (troncare) un file su Linux che esiste già ed è protetto in qualche modo?

  4. comando sed con l'opzione -i non riuscita su Mac, ma funziona su Linux

  5. È possibile che il descrittore di file linux 0 1 2 non sia per stdin, stdout e stderr?

Come modificare il file host in Linux, Windows o Mac

Come montare e smontare i file system in Linux

Comando Ls in Linux (Elenca file e directory)

File host Linux:come modificarlo e utilizzarlo?

Un'introduzione all'hashing e ai checksum in Linux

Come creare e utilizzare file di scambio su Linux