One-liner para inserir uma nova linha de texto (literalmente um regex, portanto muitos para serem caracteres com escape) em um arquivo de configuração antes de uma string específica?

1

Eu desejo modificar um arquivo sandbox do Mac OS X através de um comando de uma linha (copiar e colar), inserindo uma nova linha - contendo um regex - após uma linha que contém uma string específica (também sendo um padrão regex ).

O arquivo a ser editado requer direitos de root e está localizado em /usr/share/sandbox/clamd.sb .

As linhas de pesquisa e de anexação contêm cargas de caracteres geralmente de escape, pois são regex-es e contêm caminhos.

Pesquisar por linha contendo

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

Nota: a string é precedida por abas em um caso.

Inserir esta linha antes do jogo

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

Nota: este a ser inserido new-line-string deve ser prefixado com uma aba ( \t ).

Minha tentativa sem sucesso

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

Pergunta

Como corrigir o comando sed acima

ou

fornece uma alternativa melhor legível e funcional que pode ser usada para copiar de um site e colar no terminal do Mac OS X (bash) para estender esse arquivo de configuração do sandbox?

    
por Pro Backup 27.10.2016 / 23:54

1 resposta

1

Você não pode fazer isso com o macOS Sed, porque remove os principais espaços em branco das linhas que você está inserindo.

Usando o 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

Note que redirecionei a saída para ~/temp-clamd.sb ao invés de editar o arquivo no lugar (o que é complicado ou impossível com o BSD Awk).

Em seguida, você pode verificar se as alterações são as esperadas:

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

Se tudo estiver correto, sobrescreva o conteúdo do arquivo original com a cópia modificada ( não use mv , o que mudaria o inode, permissões, proprietário):

cat ~/temp-clamd.sb | sudo tee /usr/share/sandbox/clamd.sb
    
por 28.10.2016 / 00:15