sed中单引号的反斜杠转义会产生错误


0

目的是在之后插入 HEAD 旧版HTML网站中的Google代码。

#!/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 Tag代码中保留这些单引号?


shellcheck.net 显示您的原始代码被严重破坏(虽然我不知道答案)。很多警告“这个反斜杠+换行是字面意思。如果你只想打破这条线,就打破单引号。”因为一切都在一个单引号的字符串里面开始 sed 线。
DavidPostill

我不知道这是否可移植,但在GNUsed中可以使用十六进制转义 sed 's/f/\x27/' <<<foo 或十进制逃脱 sed 's/f/\d039/' <<<foo
Paulo

Answers:


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


我尝试在单引号周围加双引号,但这导致双引号而不是单引号。我错过了什么吗?
Edward_178118

gtag(''''js''',new Date()); \有效,gtag('''config','UA-1234567-2'''); \我只是很难理解为什么会这样。 :-)
Edward_178118

@ Edward_178118只需用我自己的两行替换你的两行。诀窍不仅仅是引用这些单引号;你需要在之前关闭一个旧的单引号并在之后重新打开。无效 'foo'bar' 变得有效 'foo'"'"'bar'
Kamil Maciorowski

你说,“单引号早先开通了”。它早先在哪里开放?第一个单引号是gtag('?
Edward_178118

第一个单引号是's?
Edward_178118
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.