Buscar línea que contenga

Buscar línea que contenga

Deseo modificar un archivo sandbox de Mac OS X mediante un comando de una línea (copiar y pegar), insertando una nueva línea, que contenga una expresión regular, después de una línea que contenga una cadena específica (que también es un patrón de expresión regular).

El archivo a editar requiere derechos de root y se encuentra en /usr/share/sandbox/clamd.sb.

Tanto las líneas de búsqueda como las de adición contienen una gran cantidad de caracteres que generalmente se escapan porque son expresiones regulares y rutas que contienen.

Buscar línea que contenga

(regex #"^/private/var/clamav/")

Nota: la cadena está precedida por tabulaciones en un caso.

Inserta esta línea antes del partido.

    (regex #"^/System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent\$")

Nota: esta cadena de nueva línea que se va a insertar debe ir precedida de una tabulación ( \t).

mi intento fallido

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

Pregunta

Cómo arreglar el sedcomando anterior

o

¿Proporciona una alternativa mejor legible y funcional que pueda usarse para copiar desde un sitio web y pegar en la terminal Mac OS X (bash) para extender este archivo de configuración de sandbox?

Respuesta1

No puedes hacer esto con macOS Sed,porque elimina los espacios en blanco iniciales de las líneas que está insertando.

Usando 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

Tenga en cuenta que he redirigido la salida en ~/temp-clamd.sblugar de editar el archivo en su lugar (lo cual es complicado o imposible con BSD Awk).

A continuación puedes comprobar que los cambios son como esperas con:

diff /usr/share/sandbox/clamd.sb ~/temp-clamd.sb

Si todo está correcto, sobrescribe el contenido del archivo original con la copia modificada (nouse mv, que cambiaría el inodo, permisos, propietario):

cat ~/temp-clamd.sb | sudo tee /usr/share/sandbox/clamd.sb

información relacionada