沢田内科医院HPの各記事下部に設置した「いいね」ボタンと、アクセスカウンタ(総計、今日、昨日)ですが、「いいね」ボタンは活用されていないと思われるし、アクセスカウンタは特定の端末からのアクセスでリセットされる不具合がある(?)ので、ここ数ヶ月の新規ページには入れていません。
今回、過去の記事ページ(複数)に対し、find及びsedの組み合わせで、複数行を一括削除する方法を試してみたので、覚え書きです。
シェルスクリプトを利用せず、コマンドラインで実行します。
バックアップファイルは作成されないので、事前に、HPルートフォルダ以下のバックアップは必須。
・・・失敗しても、元に戻せるように準備は抜かり無く。
■「いいね」ボタンを廃止
今回はコメント <!−− □FaceBook –> の行から39行を削除する。
例えば、以下のファイルなら106行目から144行目が対象となる。
<div role="clear"></div> <!-- □FaceBook --> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <!-- ■Twitter --> <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.sawada-naikaiin.com/06_hitokoma/20010115.html" data-lang="ja" data-count="vertical">ツイート</a> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> <!-- ■FaceBook --> <div class="fb-like" data-href="http://www.sawada-naikaiin.com/06_hitokoma/20010115.html" data-height="The pixel height of the plugin" data-colorscheme="light" data-layout="box_count" data-action="like" data-show-faces="true" data-send="false"></div> <!-- ■Google+ --> <!-- +1 ボタン を表示したい位置に次のタグを貼り付けてください。 --> <div class="g-plusone" data-size="tall"></div> <!-- 最後の +1 ボタン タグの後に次のタグを貼り付けてください。 --> <script type="text/javascript"> window.___gcfg = {lang: 'ja'}; (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script> <!-- ■はてなブックマーク --> <a href="http://b.hatena.ne.jp/entry/http://www.sawada-naikaiin.com/06_hitokoma/20010115.html" class="hatena-bookmark-button" data-hatena-bookmark-layout="vertical-balloon" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="http://b.st-hatena.com/images/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <!-- ■mixi --> <div data-plugins-type="mixi-favorite" data-service-key="1f34d1b7f76d90f58d093316c33911e03b177765" data-size="large" data-href="" data-show-faces="false" data-show-count="true" data-show-comment="false" data-width=""></div><script type="text/javascript">(function(d) {var s = d.createElement('script'); s.type = 'text/javascript'; s.async = true;s.src = '//static.mixi.jp/js/plugins.js#lang=ja';d.getElementsByTagName('head')[0].appendChild(s);})(document);</script> <div role="clear"></div>
一括削除するには、sedコマンドを使用し、/パターン/,+38d として、パターンにマッチした行にプラス38行で、合計39行を削除する。
実際には、いきなり削除せず、pで画面確認したり、件数を確認している。
$ sed -n '/<!-- □FaceBook -->/,+38p' ←画面に表示 $ sed -n '/<!-- □FaceBook -->/,+38p' | wc -l ←表示行数をカウント 17940 $ sed -n '/<!-- □FaceBook -->/p' | wc -l ←表示行数をカウント 460 $ sed -i '/<!-- □FaceBook -->/,+38d' ←実際に行削除を実行
17940/39=460で正解。ファイルが460個もあったら、エディタで開いて修正するのは拷問。
sed直後の-nは確認(/p)時に使用し、削除(/d)を実行する時は-iに変えます。
(注意:)実際には各sedコマンドの前に、find ./ -type f -iregex “.*\.html$” -print | xargs を記述してサブディレクトリ配下のHTMLファイルを対象にしています。
実際の削除コマンドは$ find ./ -type f -iregex ".*\.html$" -print | xargs sed -i '/<!-- □FaceBook -->/,+38d'となります。ブログで見やすいように省略しました。
■ページ下部のアクセスカウンタ(総計、今日、昨日)を廃止
今回はdivタグでクラス名がcounterの行から18行を削除する。
例えば、以下のファイルなら196行目から213行目が対象となる。
<div role="clear"></div> <div role="ac"> <div class="copyright">copyright 2012-<script type="text/javascript">myDate = new Date() ;myYear = myDate.getFullYear ();document.write(myYear);</script> sawada-naikaiin.</div> <div role="clear"></div> <div class="counter"> <div id="ac_text">総計:</div> <div id="accessCounter"> <script language="JavaScript"> <!-- c_url = "../cgi-bin/counter_06/counter.php?page=033&ref="+document.referrer; document.write("<img src='"+c_url+"'>"); // --> </script> <noscript><img src="../cgi-bin/counter_06/counter.php?page=033"></noscript> </div> </div> <div class="counter_2_3"> <div id="ac_text">今日:</div> <div id="accessCounter_2_3"><img src="../cgi-bin/counter_06/counter.php?page=033&mode=today"></div> </div> <div class="counter_2_3"> <div id="ac_text">昨日:</div> <div id="accessCounter_2_3"><img src="../cgi-bin/counter_06/counter.php?page=033&mode=yesterday"></div> </div> <div class="jump_page_top gray" onclick="window.open('20050315a.html','_self');"><!-- --><a href="20050315a.html" target="_self">TOPへ</a></div> <div class="copyright" style="clear:left;">... access count since 2012.09.29.</div> </div> <div role="clear"></div>
(ちなみに、前回の記事「copyright 年号を自動更新に」で、置き換えた部分が、194行目です。)
一括削除するには、sedコマンドを使用し、/パターン/,+17d として、パターンにマッチした行にプラス17行で、合計18行を削除する。
実際には、いきなり削除せず、pで画面確認したり、テキストファイル(a.txt)に書き出し件数を確認している。
$ sed -n '/<div class=\"counter\">/,+17p' ←画面に表示 $ sed -n '/<div class=\"counter\">/,+17p' | wc -l ←表示行数をカウント 9756 $ sed -n '/<div class=\"counter\">/,+17p' > a.txt ←ファイルにリダイレクト $ cat a.txt | grep 'class=\"counter\"' | wc -l ←ブロック数をカウント 542 $ rm -r a.txt ←確認用ファイルを削除 $ sed -i '/<div class=\"counter\">/,+17d' ←実際に行削除を実行
パターンに「”」(ダブルクォート)が含まれる場合は前に「\」(バックスラッシュ)を入れエスケープが必要でした。
9756/18=542で問題なし。sed直後の-nは確認時に使用し、削除を実行する時は-iに変えます。
(注意:)実際には各sedコマンドの前に、find ./ -type f -iregex “.*\.html$” -print | xargs を記述してサブディレクトリ配下のHTMLファイルを対象にしています。
実際の削除コマンドは$ find ./ -type f -iregex ".*\.html$" -print | xargs sed -i '/<div class=\"counter\">/,+17d'となります。ブログで見やすいように省略しました。
■「… access count since 2012.09.29.」の表示を削除
これは1行だけの削除。・・・前述のファイルなら216行の部分を削除します。
$ sed -n '/since 2012.09.29./p' ←画面に表示 $ sed -n '/since 2012.09.29./p' | wc -l ←表示行数をカウント 542 $ sed -i '/since 2012.09.29./d' ←実際に行削除を実行
(注意:)実際には各sedコマンドの前に、find ./ -type f -iregex “.*\.html$” -print | xargs を記述してサブディレクトリ配下のHTMLファイルを対象にしています。
実際の削除コマンドは$ find ./ -type f -iregex ".*\.html$" -print | xargs sed -i '/since 2012.09.29./d'となります。ブログで見やすいように省略しました。
全ての修正が完了したら、FTPでサーバへアップロードし、ブラウザで確認します。
500超ファイルの修正も数秒で完了するとは、sedコマンドはホントに素晴らしいですね。