sedの単一引用符のバックスラッシュエスケープはエラーを生成します


0

意図はHEAD、従来のHTML Webサイトの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タグコードでこれらの単一引用符を保持するにはどうすればよいですか?


shellcheck.netは、元のコードがひどく壊れていることを示しています(しかし、答えはわかりません)。多くの警告「このバックスラッシュ+改行はリテラルです。単に行を分割したい場合は、一重引用符の外側で区切ります。」すべてがsed行で始まる単一引用符で囲まれた文字列内にあるためです。
DavidPostill

私は、これは移植性があるかどうか知りませんが、GNUsedに進エスケープとなり得るsed 's/f/\x27/' <<<fooか、小数の脱出sed 's/f/\d039/' <<<foo
サンパウロ

回答:


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 2行をそれぞれの行に置き換えるだけです。トリックは、これらの単一引用符を二重引用符で囲むだけではありません。直前の古い一重引用符を閉じて、直後に再度開く必要があります。無効'foo'bar'が有効になります'foo'"'"'bar'
カミルマチオロウスキ

あなたは、「単一の引用が以前に開かれた」と言った。以前どこで開いていますか??最初の単一引用符は、GTAG(」である
Edward_178118

最初の単一引用符は
Edward_178118
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.