Поиск строки, содержащей

Поиск строки, содержащей

Я хочу изменить файл песочницы 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

Связанный контент