perlでhtmlのbodyタグの前にgoogle analyticsタグを一括設置する[複数行置換]


仕事で必要になったので
複数行置換のサンプルとしても記録

google analytics コードの整形

まずgoogle analyticsのコードをperlに置換文字列として渡すために
改行が入っていると困るので改行を\nに置換する

ga_code.txtにはgoogle analyticsのコードが書いてある

$ perl -pi.bak -e 's/\n/\\n/g' ga_code.txt

その後テキストエディタなどでスラッシュをバックスラッシュでエスケープする

perlでの置換

$ perl -pi -e "s/置換したい文字列/置換後の文字列/g" example.html

なのでindex.htmlに対しての
実際の置換コマンドが以下

$ perl -pi -e "s/<\/body>/<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga');\n\n  ga('create', 'UA-0000000-0', 'auto');\n  ga('send', 'pageview');\n\n<\/script>\n<\/body>/g" index.html

current directory以下の複数ファイルをやる時などは
findを組み合わせて

$ find . -name '*.html' -exec perl -pi -e "s/<\/body>/<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga');\n\n  ga('create', 'UA-0000000-0', 'auto');\n  ga('send', 'pageview');\n\n<\/script>\n<\/body>/g" {} \;

実行する前にはなにかしら戻せるようにしておくのがよいでしょう