2009-05-09 9 views
4

を使用してファイル内で検索人気のテキストエディタ]ダイアログボックスで開き、次の「ファイル内で検索」機能があります:実際にRubyやPythonの

Look For:  __searchtext__ 
File Filter: *.txt; *.htm 
Start From:  c:/docs/2009 
Report:   [ ] Filenames [ ]FileCount only 
Method:   [ ] Regex  [ ]Plain Text 

、いくつかの人気のテキストエディタがこれを持っているし。

同じことをしたいのですが、テキストエディタの代わりにPythonまたはRubyクラスを使用します。 そのように、この同じ種類の脳死の簡単な操作は、RubyやPythonをサポートしているプラ​​ットフォームのスクリプトから実行できます。

質問:私はこれを自分で書くように感じることはありませんは、そう誰もがあなたが期待するものと同じまたは類似した簡単な入力引数を受け入れ、ないルビーやPythonのスクリプトを知っていますか?

私は、強引な線形検索を行うものを探しています。インデックス付き検索とは関係ありません。

答えて

5

私はあなたがそれを自分で書くように感じることはありませんが、それは価値があるもののために、それはos.walkを使用して非常に簡単だろうと述べた知っている - あなたはこのような何かを行うことができます:

results = [] 
if regex_search: 
    p = re.compile(__searchtext__) 
for dir, subdirs, subfiles in os.walk('c:/docs/2009'): 
    for name in fnmatch.filter(subfiles, '*.txt'): 
     fn = os.path.join(dir, name) 
     with open(fn, 'r') as f: 
      if regex_search: 
       results += [(fn,lineno) for lineno, line in enumerate(f) if p.search(line)] 
      else: 
       results += [(fn,lineno) for lineno, line in enumerate(f) if line.find(__searchtext__) >= 0] 

(つまり、Pythonの、私はgrepのにアウトシェル、それを信じる

g = Grepper.new 
g.files = %w{ one.txt two.txt three.txt } 
g.options = %w{ B2 } # two lines of before-context 
g.pattern = /__search_string__/ 
g.run 

g.results.each do |file, result| 
    result.matches.each do |lineno, before, line, after| 
    etc.... 

とRubyのオブジェクトで結果をラップし、:ところで)

+0

ファイル名のフィルタについて忘れましたか? –

+1

標準ライブラリのfnmatchモジュールを使用して、os.path.joinの前に1行追加するだけです。 'fnmatch.fnmatch(name、 '* .txt'):continue'などのようにします。 –

+0

@Bartosz:ええ、私はやった...修正アレックスに感謝します。 –

3

Grepperは、まさにそれを行うためのデビッド・A・ブラックによるRubyの逸品ですつまり、grepと同じオプションが使用されます。インストール先:

sudo gem install grepper