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 vongnu-sed
angewiesen - Prüfen Sie Ihre Skripte, um zwischen
gsed
zu wählen odersed
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.