【问题标题】:find in files using ruby or python使用 ruby​​ 或 python 在文件中查找
【发布时间】:2010-10-24 23:07:38
【问题描述】:

流行的文本编辑器具有以下在对话框中打开的“在文件中查找”功能:

 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 脚本可以接受相同或相似的简单输入 args 并执行您所期望的操作?

我正在寻找可以进行强力线性搜索的东西,与索引搜索无关。

【问题讨论】:

    标签: python ruby search file grep


    【解决方案1】:

    我知道你说过你不想自己写它,但对于它的价值,使用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,顺便说一句)

    【讨论】:

    • 你没有忘记文件名过滤器吗?
    • 使用标准库 fnmatch 模块在 os.path.join 之前添加一行,例如if not fnmatch.fnmatch(name, '*.txt'): continue 之类的。
    【解决方案2】:

    Grepper 是 David A. Black 的 Ruby gem,正是因为它做到了这一点:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多