grepとsedを使った大量置換

 スタティックhtmlであるマンホール漫遊記の中のはてなダイアリーへのリンクを自動コンバートされたはてなブログへのリンクに書き換える。

before:http://d.hatena.ne.jp/doroace/20101011
after:https://doroace.hatenadiary.jp/entries/2010/10/11

 行数を調べる。

kazz@oscar ~/homepage/lance/manhole# grep "http:\/\/d\.hatena\.ne\.jp\/doroace\/" **/*.html |wc -l
957

 957行もある。人力では無理。

 sedの置換スクリプト。{}のエスケープに引っかかりがち。

s/http:\/\/d\.hatena\.ne\.jp\/doroace\/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/https:\/\/doroace\.hatenadiary\.jp\/entries\/\1\/\2\/\3/g

 grepとxargsとsedで一括置換。-iオプションでバックアップファイルを残す。最近知ったzshの**を使う。

kazz@oscar ~/homepage/lance/manhole# grep "http:\/\/d\.hatena\.ne\.jp\/doroace\/" **/*.html -l|xargs sed -i."bak" -f doroace.sed

 処理自体は一瞬で完了。内容も確認、無事置換できていた。
 タイムスタンプが変わってしまったので更新作業がやりにくくなってしまった。シェルスクリプトかphpスクリプトでタイムスタンプを戻してやればよかった。

追記

 戻した。

<?php
$oldfile = $argv[1];
$newfile = str_replace(".bak", "", $oldfile); 
$timestamp = filemtime($oldfile);
touch($newfile, $timestamp);
?>
kazz@oscar ~/homepage/lance/manhole# find . -name *.html.bak -mtime +0 -exec php timestamp.php {} \;