Я хочу изменить файл песочницы 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
, что изменит индексный дескриптор, права доступа, владельца):
cat ~/temp-clamd.sb | sudo tee /usr/share/sandbox/clamd.sb