4

一般的なテキスト エディタには、ダイアログ ボックスで開く次の「ファイル内検索」機能があります。

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

実際、いくつかの一般的なテキスト エディタにはこれがあります。

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

質問: 私はこれを自分で書きたくないので、同じまたは類似の簡単な入力引数を受け入れて、あなたが期待することを実行する ruby​​ または python スクリプトを知っている人はいますか?

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

4

2 に答える 2

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です、ところで)

于 2009-05-09T04:23:14.413 に答える
3

Grepperは、まさにそれを行うためのDavidA.BlackによるRubygemです。

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....

grepにシェルアウトし、結果をRubyオブジェクトにラップすると思います。つまり、grepと同じオプションを使用します。インストール方法:

sudo gem install grepper
于 2009-05-09T06:33:25.100 に答える