GNU/Linux >> LINUX-Kenntnisse >  >> Linux

sed In-Place-Flag, das sowohl auf Mac (BSD) als auch auf Linux funktioniert

Unter OSX installiere ich die GNU Sed-Version immer über Homebrew, um Probleme in Skripten zu vermeiden, da die meisten Skripte für GNU Sed-Versionen geschrieben wurden.

brew install gnu-sed --with-default-names

Dann wird Ihr BSD-Sed durch GNU-Sed ersetzt.

Alternativ können Sie auch ohne Default-Namen installieren, aber dann:

  • Ändern Sie Ihren PATH wie nach der Installation von gnu-sed angewiesen
  • Prüfen Sie Ihre Skripte, um zwischen gsed zu wählen oder sed abhängig von Ihrem System

Dies funktioniert mit GNU sed, aber nicht unter OS X:

sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file

Dies funktioniert unter OS X, aber nicht mit GNU sed:

sed -i '' -e 's/foo/bar/' target.file

Unter OS X können Sie

  • kann sed -i -e nicht verwenden da die Erweiterung der Sicherungsdatei auf -e gesetzt würde
  • kann sed -i'' -e nicht verwenden aus den gleichen Gründen – es braucht ein Leerzeichen zwischen -i und '' .

Wenn Sie wirklich wollen, verwenden Sie einfach sed -i Der 'einfache' Weg, das Folgende funktioniert sowohl auf GNU als auch auf BSD/Mac sed :

sed -i.bak 's/foo/bar/' filename

Beachten Sie den Platzmangel und den Punkt.

Beweis:

# 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

Natürlich könnte man dann einfach den .bak löschen Dateien.


Wie Noufal Ibrahim fragt, warum können Sie Perl nicht verwenden? Jeder Mac wird Perl haben, und es gibt sehr wenige Linux- oder BSD-Distributionen, die keine Version von Perl im Basissystem enthalten. Eine der wenigen Umgebungen, in denen Perl möglicherweise fehlt, wäre BusyBox (das wie GNU/Linux für -i funktioniert , außer dass keine Sicherungserweiterung angegeben werden kann).

Wie ismail empfiehlt,

Da Perl überall verfügbar ist, mache ich einfach perl -pi -e s,foo,bar,g target.file

und dies scheint in fast jedem Fall eine bessere Lösung zu sein als Skripte, Aliase oder andere Problemumgehungen, um mit der grundlegenden Inkompatibilität von sed -i fertig zu werden zwischen GNU/Linux und BSD/Mac.


Linux
  1. Linux .htaccess Tipps und Tricks

  2. Unterstützte und empfohlene Dateisysteme unter Linux

  3. sed-Befehlsbeispiele unter Linux

  4. Wie kann man eine Datei unter Linux leeren (abschneiden), die bereits existiert und irgendwie geschützt ist?

  5. sed-Befehl mit Option -i schlägt auf Mac fehl, funktioniert aber unter Linux

So bearbeiten Sie die Hosts-Datei unter Linux, Windows oder Mac

So mounten und unmounten Sie Dateisysteme in Linux

Ls-Befehl in Linux (Dateien und Verzeichnisse auflisten)

Linux-Hostdatei:Wie wird sie bearbeitet und verwendet?

Eine Einführung in Hashing und Prüfsummen in Linux

So erstellen und verwenden Sie eine Auslagerungsdatei unter Linux