Ich möchte eine Mac OS X-Sandbox-Datei mit einem einzeiligen Befehl (Kopieren und Einfügen) ändern, indem ich nach einer Zeile, die eine bestimmte Zeichenfolge (ebenfalls ein Regex-Muster) enthält, eine neue Zeile mit einem regulären Ausdruck einfüge.
Die zu bearbeitende Datei erfordert Root-Rechte und liegt unter /usr/share/sandbox/clamd.sb
.
Sowohl die Such- als auch die Anfügezeilen enthalten eine Menge Zeichen, die normalerweise maskiert werden müssen, da es sich dabei um reguläre Ausdrücke handelt und diese Pfade enthalten.
Suche nach Zeile mit
(regex #"^/private/var/clamav/")
Hinweis: In einem Fall sind der Zeichenfolge Tabulatoren vorangestellt.
Fügen Sie diese Zeile vor dem Match ein
(regex #"^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent\$")
Hinweis: Dieser einzufügenden Zeilenumbruchzeichenfolge sollte ein Tabulator ( \t
) vorangestellt werden.
Mein fehlgeschlagener Versuch
sudo sed -i '' -e $'/(regex #"\^\/private\/var\/clamav\/")/a \t(regex #"\^\/System\/Library\/PrivateFrameworks\/TrustEvaluationAgent\.framework\/Versions\/A\/TrustEvaluationAgent\\\$")' /usr/share/sandbox/clamd.sb
sed: 1: "/(regex #"\^\/private\/ ...": command a expects \ followed by text
Frage
So beheben Sie den obigen sed
Befehl
oder
eine besser lesbare und funktionierende Alternative bereitstellen, die zum Kopieren von einer Website und Einfügen in das Mac OS X-Terminal (Bash) verwendet werden kann, um diese Sandbox-Konfigurationsdatei zu erweitern?
Antwort1
Mit macOS Sed ist das nicht möglich.weil es führende Leerzeichen aus den Zeilen entfernt, die Sie einfügen.
Verwenden von Awk:
awk '/\(regex #"\^\/private\/var\/clamav\/"\)/ {print "\t(regex #\"^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent\$\")"}; {print}' /usr/share/sandbox/clamd.sb > ~/temp-clamd.sb
Beachten Sie, dass ich die Ausgabe umgeleitet habe, ~/temp-clamd.sb
anstatt die Datei direkt zu bearbeiten (was mit BSD Awk schwierig oder unmöglich ist).
Als Nächstes können Sie mit folgendem Befehl überprüfen, ob die Änderungen Ihren Erwartungen entsprechen:
diff /usr/share/sandbox/clamd.sb ~/temp-clamd.sb
Wenn alles korrekt ist, überschreiben Sie den Inhalt der Originaldatei mit der geänderten Kopie (nichtverwenden mv
, wodurch Inode, Berechtigungen und Eigentümer geändert würden):
cat ~/temp-clamd.sb | sudo tee /usr/share/sandbox/clamd.sb