sedを使った部分置換 | ヘビィ・SMD!

ヘビィ・SMD!

そんな・・・バナナ!!
1. 甘え度+10 恐れ度+10 寿命-1週間
2. 甘え度+10 恐れ度-10
3. 甘え度-10 恐れ度-10 寿命+1週間

ECサイトを扱っていて、SEO対策としてURLを変更する事がある。
具体的には

修正前:
<A href="/goods/?id=00004028">商品Aへリンクする</A><BR />
<A href="/goods/?id=00052387">商品Bへリンクする</A><BR />
<A href="/goods/?id=80024143">商品Cへリンクする</A><BR />
修正後:
<A href="/goods/detail/00004028/">商品Aへリンクする</A><BR />
<A href="/goods/detail/00052387/">商品Bへリンクする</A><BR />
<A href="/goods/detail/80024143/">商品Cへリンクする</A><BR />

こんな感じ。商品IDが8文字の数字の前提で、
?id= の部分を detail/ にして、
8文字のidの後ろに / を追記する。

動的出力している場合はロジックを組み直せばいいけど、
静的ページにゴリ押しで書かれている場合は置換しなくちゃいけない。
(rewriteとかも有効な手段ではあるが。)

linuxのコマンド sed を利用して、正規表現を利用した部分置換を行う。

基本的な利用方法は

// ============================================ //
// $ sed -i "s/置換前文字列/置換後文字列/g" ファイル名
// ============================================ //

これで該当ファイルの中身を修正できる。(sedの細かい使い方はリファレンスみてね!)
sedコマンドはパターンのグループ化が出来るので、8文字のidをグループ化して置換してみる。

つまりこうだ。

$ sed -i "s/\"\/goods\/?id=\([0-9]\{8\}\)\"/\"\/goods\/detail\/\1\/\"/g" ファイル名

ここでの置換前文字列は
\"\/goods\/?id=\([0-9]\{8\}\)\"
になる。エスケープ文字で見づらいなぁ。
\([0-9]\{8\}\) がグループ化しているところ。数字8文字のidの箇所。
※以下補足
[0-9] ←数字。
\{8\} ←8回繰り返し。
\(パターン\) ←グループ化されるパターン。

で、置換後の文字列が
\"\/goods\/detail\/\1\/\"
になる。\1が「1番目のグループ化文字」に相当する。

ちなみに、置換対象のファイルが複数存在する場合は僕はこうする。
$ grep -rl "置換前文字列" 対象ディレクトリ | xargs sed -i "s/置換前文字列/置換後文字列/g"
これで一括で痴漢出来るぞ!