Намерение заключается в том, чтобы вставить сразу после кода тега HEAD Google на устаревший веб-сайт HTML.

#!/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 || [];\
  function gtag(){dataLayer.push(arguments);}\
  gtag('js', new Date());\
\
  gtag('config', 'UA-1234567-2');\
</script>*' "$i"

done

Выше приведен код тега Google, где он должен, но без одинарных кавычек:

<!-- 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);

Одинарные кавычки отсутствуют после его обработки:

# 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);

Если я заменяю ' на \' , я получаю сообщение об ошибке:

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

Поскольку я использую \ для продолжения каждой строки, я не был уверен, что обратная косая черта, чтобы избежать одиночной кавычки, сработает, но я решил попробовать.

Как я могу сохранить эти одинарные кавычки в коде тега Google?

1 ответ1

1

От man 1 bash:

Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Решение: поместите одинарные кавычки в двойные кавычки:

  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.

Повторите этот трюк, где вам нужно, это будет выглядеть так:

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

(помните, что эта строка продолжает предыдущую, где одиночная кавычка уже открыта; в конце она оставляет ее открытой для закрытия на следующей строке).

Как правило, можно заключать только ' в двойные кавычки, оставляя все остальное в одинарные кавычки, например:

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

Результат $A'$B'$C

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .