作者: Koichi Yamamoto
日時: 2003/12/3(00:42)
こんにちは、山本です。

"HFC01730@... (水羽信男)"さんは書きました:
> 1)僕の課題は159あるGB2312のhtmlファイルすべてに検索をかけて、特定のキーワードの
>  使用状況の確認でした。

おせっかいかと思いましたが、Tcl/Tkで↓を作ってみました。
Windowsをお使いのようでしたので、Windows用のスクリプトとして
作ってあります。実行にはActiveTclが必要です。
(http://aspn.activestate.com/ASPN/Tcl)

このスクリプトはWindowsの漢字コード(SJISというかcp932)で
"find.tcl"というファイルに保存して、エクスプローラから
ダブルクリックして起動してください。
# utf-8やGB2312など他のencodingで保存しないでください。

なお、私はGB2312のファイルを持っていないので、
これでちゃんと検索できるかどうかは判りません m(_._)m

===== ここから ============================================================
set enc "gb2312"                ;# Windows漢字で検索する場合は "cp932"
set filePattern "*.htm *.html"  ;# grepするファイル名のパターン

# widgetのセットアップ
option add *font {{MS ゴシック} 9}
grid [label .descFolder -text フォルダ: -anchor e] \
    [entry .folder -textvariable folder -width 40] \
    [button .chooseFolder -text 選択... -command chooseFolder] \
    -row 0 -sticky ew
grid [label .descFile -text ファイル名: -anchor e] \
    [entry .filePattern -textvariable filePattern -width 40] \
    -row 1 -sticky ew
grid [label .descPattern -text 検索パターン: -anchor e] \
    [entry .pattern -textvariable pattern -width 40] \
    [button .grep -text 検索 -command grep] \
    -row 2 -sticky ew
grid [text .result -width 80 -height 20 -yscrollcommand {.ys set} -wrap none] \
    -row 3 -column 0 -columnspan 3 -sticky nesw
grid [scrollbar .ys -orient vertical -command {.result yview}] \
    -row 3 -column 3 -sticky ns
bind .pattern <Return> grep
focus -force .pattern
set folder [pwd]
# フォルダを選択する
proc chooseFolder args {
  set ::folder [tk_chooseDirectory -initialdir $::folder]
}
# grepする
proc grep args {
  .result delete 1.0 end
  set filecount 0
  foreach pat $::filePattern {
    foreach filename [glob -nocomplain [file join $::folder $pat]] {
      set fd [open $filename]
      fconfigure $fd -encoding $::enc
      # 読み込んだHTMLに含まれる"<"から">"までを削除
      regsub -all -- {<[^>]*>} [read $fd] {} html
      close $fd
      set count [regexp -all -- $::pattern $html]
      if $count {
		incr filecount
        .result insert end "[format %8d $count]件 "
        .result insert end $filename $filecount
        .result insert end \n
        .result see end
        .result tag configure $filecount -foreground blue -underline 1
        .result tag bind $filecount <Button-1> [list shellexecute $filename]
        .result tag bind $filecount <Enter> \
            [list .result tag configure $filecount -background yellow]
        .result tag bind $filecount <Leave> \
            [list .result tag configure $filecount -background white]
      }
    }
  }
  .result insert 1.0 $filecount個のファイルに見つかりました。\n
  .result mark set insert 1.0
  .result see insert
}
# Windowsシェルを利用してファイルを開く
package require tcom
set shell [::tcom::ref createobject Shell.Application]
proc shellexecute filename {
  $::shell ShellExecute [regsub -all -- / $filename \\]
}
===== ここまで ============================================================


--
Koichi Yamamoto, 
http://homepage3.nifty.com/yamakox/