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 |

2010-12-21

日常LISP (1) ファイル内の文字列置換

| 23:34 | 日常LISP (1) ファイル内の文字列置換 - わだばLisperになる を含むブックマーク はてなブックマーク - 日常LISP (1) ファイル内の文字列置換 - わだばLisperになる

とにかく普段からLISPを使っていこうという、有意義なのかどうか分からない試みの記録。

日々遭遇するちょっとした仕事をできる限りCommon Lispで処理し、その感想をつらつらとまとめます。

できそうではあったけれど、手間や環境が原因でシェルスクリプト等に逃げてしまったものは、メモしておいて次回の対策を練ってみます。

さて、今日は、sedでできそうな仕事をCLで処理しました。

以前、職場のブログに書いてしまったネタとかぶる気がしますが、まあ良しとします。

(defun run ()
  (let ((suf "_removeme_"))
    (iterate ((file (scan (directory "/tmp/foo/**/*.html"))))
      (let ((nfile (format nil "~A.~A.htm" file suf)))
        (with-< (in file)
          (with-> (out nfile)
            (sed "<!-- ここからですよ -->"
                 "<!-- ここまでですよ -->"
                 "置換する内容ですよ
2行目ですよ
3行目ですよ"
                 :in in
                 :out out)))
        (rename-file nfile file)))))
;;
(run)

作業内容は、

  1. あるディレクトリ以下のHTMLファイル全部を開き
  2. 「ここから〜ここまで」を「置換する内容ですよ」で置換
  3. 置換した内容で上書き

という内容です。

実行は、SLIME上から実行します。

使っているライブラリは、

  1. series(iterate、scan)
  2. 俺関数

です。

俺関数ですが、

  1. WITH-<、WITH->はWITH-OPEN-FILEをちょっと加工したもので、入力と出力専用です。(WITH->はUnix風に上書き基本です。)
  2. SEDはsed風な動きをするだけで全然sedじゃないですが良いんです。

というところです。

おすすめポイントですが、細かいところは処理系依存のようですが、DIRECTORY(というかCLのパス名)は、**/*.htmlというzshのように再帰的に表記ができます。

これとENSURE-DIRECTORIES-EXISTを組み合せると結構便利だったりします。

気持ち的に負けてるなと感じるポイントは、パス周りを文字列として扱っているところですが、色々面倒なので割り切ってます。

ゲスト



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