Usando sed para substituir o código javascript em vários arquivos

1

Eu preciso substituir um antigo código do Google Analytics pelo novo código de acompanhamento universal em vários arquivos HTML estáticos. O código antigo é assim:

_uacct = "UA-XXXXXX-X";
urchinTracker();

O novo código é o seguinte:

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', 'UA-XXXXXX-X', 'xxx.com');ga('require', 'displayfeatures');ga('send', 'pageview');

Estou tentando combinar o comando bash find e sed (CentOS 6):

find docs/ -type f -iname "*.html" -exec sed -i ':a;N;$!ba;s/_uacct = "UA-XXXXXX-X";\nurchinTracker();/(function(i,s,o,g,r,a,m){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,\'script\',\'\/\/www.google-analytics.com\/analytics.js\',\'ga\');ga(\'create\', \'UA-XXXXXX-X\', \'xxx.com\');ga(\'require\', \'displayfeatures\');ga(\'send\', \'pageview\');/g' {} \;

No entanto, isso produz o seguinte erro:

-bash: syntax error near unexpected token '('

Depois de algumas pesquisas, descobri que os colchetes também deveriam ter escapado:

find arts/ -type f -iname "bass.html" -exec sed -i ':a;N;$!ba;s/_uacct = "UA-XXXXXX-X";\nurchinTracker();/\(function\(i,s,o,g,r,a,m\){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function\(\){\(i[r].q=i[r].q||[]\).push\(arguments\)},i[r].l=1*new Date\(\);a=s.createElement\(o\),m=s.getElementsByTagName\(o\)[0];a.async=1;a.src=g;m.parentNode.insertBefore\(a,m\)}\)\(window,document,\'script\',\'\/\/www.google-analytics.com\/analytics.js\',\'ga\'\);ga\(\'create\', \'UA-XXXXXX-X\', \'xxx.com\'\);ga\(\'require\', \'displayfeatures\'\);ga\(\'send\', \'pageview\'\);/g' {} \;
> 
> 

Como você pode ver o bash acha que algo não escapou, quebra a linha e não executa o comando. Poderia, por favor, avisar o que estou fazendo errado?

Se isso for possível com outra ferramenta (digamos awk), por favor avise.

Obrigado antecipadamente.

    
por Sray 24.04.2015 / 08:24

2 respostas

0

Você não pode escapar de aspas simples entre aspas simples. A maneira mais fácil para você é colocar seu script em um arquivo e, em seguida, executar

find arts/ -type f -iname "bass.html" -exec sed -i -f your-script.sed '{}' \;
    
por 24.04.2015 / 08:44
0

Isso funcionou para mim

find docs/ -type f -iname "*.html" -exec \
perl -i.bak -0pe 's/_uacct = "UA-XXXXXX-X";\nurchinTracker\(\);/test/igs' {} \;

Observe que -i.bak faz uma cópia do arquivo original com extensão .bak , caso algo dê errado. A substituição é agora a string test . Substitua isso pelo seu longo substituto.

Com o seu enorme substituto, ficaria assim:

find docs/ -type f -iname "*.html" -exec perl -i.bak -0pe "s/_uacct = \"UA-XXXXXX-X\";\nurchinTracker\(\);/\(function\(i,s,o,g,r,a,m\)\{i\['GoogleAnalyticsObject'\]=r;i\[r\]=i\[r\]\|\|function\(\)\{\(i\[r\].q=i\[r\].q\|\|\[\]\).push\(arguments\)\},i\[r\].l=1\*new Date\(\);a=s.createElement\(o\),m=s.getElementsByTagName\(o\)\[0\];a.async=1;a.src=g;m.parentNode.insertBefore\(a,m\)\}\)\(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga'\);ga\('create', 'UA-XXXXXX-X', 'xxx.com'\);ga\('require', 'displayfeatures'\);ga\('send', 'pageview'\);/igs" {} \;
    
por 24.04.2015 / 08:50

Tags