sedを使用して複数のファイルのJavaScriptコードを置き換える

sedを使用して複数のファイルのJavaScriptコードを置き換える

多くの静的HTMLファイルでは、既存のGoogle Analyticsコードを新しい汎用トラッキングコードに置き換える必要があります。前のコードは次のとおりです。

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

新しいコードは次のとおりです。

(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');

bash findコマンドを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' {} \;

ただし、これにより次のエラーが発生します。

-bash: syntax error near unexpected token `('

いくつかの研究の終わりに、角かっこもエスケープする必要があるという事実を発見しました。

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' {} \;
> 
> 

ご覧のとおり、bashは何かがエスケープされていないと考えて行を破ってコマンドを実行しません。

私は何が間違っていましたか?

他のツール(例えばawk)を使ってこれを行うことができますか?

ベストアンサー1

あなた一重引用符の中に一重引用符をエスケープすることはできません。。最も簡単な方法は、スクリプトをファイルに入れて実行することです。

find arts/ -type f -iname "bass.html" -exec sed -i -f your-script.sed '{}' \;

おすすめ記事