Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-10-03

Common Lispで日常のちょっとした仕事

| 23:37 | Common Lispで日常のちょっとした仕事 - わだばLisperになる を含むブックマーク はてなブックマーク - Common Lispで日常のちょっとした仕事 - わだばLisperになる

昔のブログのエントリーを新しくWordPressに移行するためにデータの中のURLを書き換える、というちょっとした仕事があったのですが、最初sedでやってみました。

一緒に仕事をしているWebデザイナーさんに

「やっぱりLISPでやったんですか?」と訊かれたんですが、

「いや、これは別の言語でやりました」

と答えたのが妙に心残りだったのでCLで書いてみました(笑)

やりたいことは、

MovableType形式のバックアップデータのエントリー中の画像リンクのURLの変換です。

"http://example.com/imgs/1/2/3/abcd.jpg"という形式なのですが、

"http://new.example.com/wp-content/uploads/imgs/1_2_3_abcd.jpg"という風に直します。

いざ、書いてみると、sed並に簡単に書けたりするので割と悪くないなと思います。

ただ、ちょっとしたものを書くにはwith-open-fileは長いので、Arc風にw/outfileなどのマクロを定義して置くともっと手軽に書き捨てられるかと。

…というか多少面倒でもCLで書いて行こうと誓いました(笑)

どういう作業形態になるかというと、下記のようなものをSlime上のバッファに書いて、適当に評価するという感じになります。

Emacsのスクラッチと大体似た感覚で、UNIXのシェルで色々やるのとは、ちょっと違った感じですが、慣れるとこれはこれで良い感じです。

;; ファイルを文字列のリストとしてとりこむ
(DEFVAR *OLD-BLOG* (KMRCL:READ-FILE-TO-STRINGS "/home/mc/Desktop/blog-backup.txt"))

;; CL-PPCRE:REGEX-REPLACE-ALLで使う関数("/"を"_"に変換する)
(DEFUN /->_ (MATCH 1ST 2ND)
  (DECLARE (IGNORE MATCH 1ST))
  (FORMAT NIL "~A" (SUBSTITUTE #\_ #\/ 2ND)))

;; これを評価
(LET ((SCANNER (PPCRE:CREATE-SCANNER "\"\\s*http://(image.)*example.com/imgs/([^\"]*)\""))
      (REPLACE (LIST "\"/wp-content/uploads/imgs/" #'/->_ "\"")))
  (WITH-OPEN-FILE (OUT "/tmp/result.txt" :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)
    (DOLIST (LINE *OLD-BLOG*)
      (FORMAT OUT 
              "~A~%"
              (PPCRE:REGEX-REPLACE-ALL SCANNER LINE REPLACE :SIMPLE-CALLS 'T)))))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091003