我确实希望通过一行(复制和粘贴)命令修改 Mac OS X 沙箱文件,方法是在包含特定字符串(也是正则表达式模式)的行之后插入包含正则表达式的新行。
要编辑的文件需要 root 权限,位于/usr/share/sandbox/clamd.sb
.
搜索行和附加行都包含大量通常需要转义的字符,因为这些是正则表达式并包含路径。
搜索包含以下内容的行
(regex #"^/private/var/clamav/")
注意:在一种情况下,字符串前面带有制表符。
在匹配之前插入此行
(regex #"^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent\$")
注意:要插入的换行符应在前面添加一个制表符 ( \t
)。
我失败的尝试
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
问题
如何修复上述sed
命令
或者
提供一个更好的可读性和工作替代方案,可用于从网站复制并粘贴到 Mac OS X 终端 (bash) 来扩展此沙箱配置文件?
答案1
你不能用 macOS Sed 做到这一点,因为它会从您要插入的行中删除前导空格。
使用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
请注意,我已将输出重定向到~/temp-clamd.sb
而不是就地编辑文件(这对于 BSD Awk 来说很棘手或不可能)。
接下来,您可以检查更改是否符合您的预期:
diff /usr/share/sandbox/clamd.sb ~/temp-clamd.sb
如果一切正确,请使用修改后的副本覆盖原始文件的内容(不使用mv
,这会更改 inode、权限、所有者):
cat ~/temp-clamd.sb | sudo tee /usr/share/sandbox/clamd.sb