escape de barra invertida para aspas simples em sed produz um erro

0

A intenção é inserir logo após o código da tag HEAD Google em um site HTML legado.

#!/bin/bash

find . -type f -iname "*.php" -or -iname "*.htm" -or -iname "*.html" | while read i; do
    echo "Processing: $i"
    sed -i 's*<HEAD>*&\
<!-- Global site tag (gtag.js) - Google Analytics -->\
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-1234567-2"></script>\<script>\window.dataLayer=window.dataLayer||[];\functiongtag(){dataLayer.push(arguments);}\gtag('js',newDate());\\gtag('config','UA-1234567-2');\</script>*'"$i"

done

O texto acima coloca o código da tag do Google onde deveria, mas sem as aspas simples:

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-1234567-2"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag(js, new Date());

  gtag(config, UA-1234567-2);

As aspas simples estão faltando após serem processadas:

# diff actual_google_tag_code processed
6c6
<   gtag('js', new Date());
---
>   gtag(js, new Date());
8,9c8
<   gtag('config', 'UA-1234567-2');
< </script>
---
>   gtag(config, UA-1234567-2);

Se eu substituir o ' por um \' , recebo uma mensagem de erro:

line 13: syntax error near unexpected token '('
line 13: '  gtag(\'js\', new Date());\'

Como estou usando \ para continuar cada linha, não sei se a barra invertida para escapar da cota única funcionaria, mas achei que tentaria.

Como posso preservar essas aspas simples no código da tag do Google?

    
por Edward_178118 31.12.2017 / 18:07

1 resposta

1

Em man 1 bash :

Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

Solução: coloque aspas simples entre aspas duplas:

  gtag('"'js'"', new Date());\
#      ^        - single quote was opened earlier, this character closes it
#       ^^^^^^  - these are double quotes with content, single quotes are part of the content
#             ^ - this single quote will be closed later
# Do not paste these comments into your script.

Repita este truque sempre que precisar, será como:

  gtag('"'config', 'UA-1234567-2'"');\

(lembre-se que esta linha continua a anterior, onde uma aspa simples já está aberta; no final, ela fica aberta para ser fechada na próxima linha).

Em geral, é possível colocar apenas ' entre aspas duplas, deixando todo o resto entre aspas simples, por exemplo:

echo '$A'"'"'$B'"'"'$C'
#     ^^     ^^     ^^ - in single quotes, so no variable expansion here
#         ^      ^     - in double quotes, so ' is possible

O resultado é $A'$B'$C .

    
por 31.12.2017 / 18:38