Haskell版だとその日の関係ないエントリも上がってきてしまうので、どうにかするやつをRubyで書いた。-dオプションでエントリの内容詳細も出力するようにした。
require 'optparse' require 'kconv' class String def is_int? return /^#{self.to_i}(\.0+)?$/ =~ self ? true : false end end def search(search,file_path,detail) file = File.open(file_path,"r") lines = [] while line = file.gets lines.push line end file.close title_flag = FALSE #titleのところにlineがあればTRUE、それ以外はFALSE lines.each{|line| line = line.split(//e) if line.length == 0 search_flag = FALSE else search_flag = TRUE end line[1..10].map{|item| search_flag = search_flag && item.is_int?} search_flag = line.join.include?("["+search+"]") && search_flag #タイトルかつ検索タグが入っているかのフラグ if (search_flag == TRUE) && (title_flag == FALSE) title_flag = TRUE elsif (search_flag == TRUE) && (title_flag == TRUE) title_flag = FALSE elsif (search_flag == FALSE) && (title_flag == TRUE) title_flag = TRUE elsif (search_flag == FALSE) && (title_flag == FALSE) title_flag = FALSE end if search_flag puts file_path puts line.join end if detail & title_flag puts line.join unless search_flag end } end text_files = [] dir_group = '/home/yasuhisa/.hatena/syou6162/group/syou6162/' dir_diary = '/home/yasuhisa/.hatena/syou6162/diary/' Dir.glob("#{dir_group}**\.txt"){|file| text_files.push file} Dir.glob("#{dir_diary}**\.txt"){|file| text_files.push file} search = "Haskell" detail = FALSE opt = OptionParser.new opt.on('-d') {|v| detail= v } opt.parse!(ARGV) if ARGV.length == 0 puts "引数が必要です。" #複数の検索語に対応しようと思ったけど、とりあえずタグ検索すればどうにかなるので放置 exit end begin text_files.map{|file| search(ARGV[0],file,detail) } rescue => ex raise ex.message end