少し苦戦した…
すでにコンテンツのあるサイトのドメイン移転とサーバ変更、管理の委託を依頼されて作業を行う。
- ドメイン移管
- サーバの変更
- コンテンツの設置
- メールアカウントの設定
以上は、問題なく完了。
さて、あとはコンテンツの修正。
そこで、各ページに仕込む必要があるけれど、いちいち修正するのはさすがに面倒。
なにせ30ページ程のhtmlが2つもある。
こんな時は、sedの登場ですな。
まずは、jsフォルダを作成。
以下のような内容のg_ana.jsを作成。まぁ、ここまでは、Google Analyticsの吐き出すコードをほんの少し変更するだけでOK
(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-xxxxxxxxx', 'auto');
ga('send', 'pageview');
でもって、こいつを読み込むように各htmlに書き込む。
とりあえず、</head>の前に設置すれば良いので、
<script type="text/javascript" src="js/g_ana.js"></script></head>
に置換をかければ良いわけだ。
sedで処理する
60回以上も「ファイルを開く」→「編集(貼付けるだけなんだけど)」→「保存」なんてやってられない。
$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script></head># ./index.html | less
で確認してみる。
とりあえず、OKなのを確認。
まあ、これで何も問題はないのだけれど、ソースを見た時に</head>の位置が気持ち悪い。(美しくない)
<script type="text/javascript" src="js/g_ana.js"></script>
</head>
こうなっていて欲しい。</script>と</head>の間に改行を入れたいちゅうわけだ。
こんなもの、\nを含めて置換すりゃ一発と思ったのだけれど、これが上手くいかない。
$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>\n</head>#
結果を見ると、</script>n</head> 改行されない。しかも\n→n になってるだけやんか…。
試行錯誤を、繰り返す。
繰り返す
繰り返す×10…
苦戦したわ。
最終的には、以下の用に記述すればOKだった。
$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#'
置換したい文字列に"(ダブルクォート)が含まれているので、基本的には’(シングルクォート)で囲んでいる。
A='s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'
改行=\\$'\n\
B='</head>#'
という形でOK。
最後に罠が…
これでOKだろうと思ったが、実際に書きだす前に最終確認。
$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html
index.htmlは問題なく置換したが、途中でERRORを吐いた。
sed: RE error: illegal byte sequence
なぬ?
よく調べてみると、文字コードがUTF-8だけでなく、EUC-JPで書かれたコンテンツが混ざっている。
こらこら。
文字コードまで変換するのは、もっと面倒。なので、そのまま置換したい。
先頭におまじないを付けてやることで回避した。
$ LC_ALL=C sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html
これで、文字コードが混在していてもOK。
最終的には、以下のコードを実行。
$ LC_ALL=C sed -i.bak 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html
-i.bakオプションで、元のhtmlをhtml.bakにして保存する。
まあ、当然コピーで作業しているから、不要なんだけど、あとですぐdiffしたいし、ミスがあったら書き戻せるようにしておきたいからね。
ちゅうことで、60回以上エディタで書き換える作業をすること無く、終了。
時間的には、少し短いくらいかもしれないけど、精神衛生上極めて気持ちがいい。
改行1つに拘らなければ、1分で作業完了だったけど…(笑)
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。