найти в файлах, используя ruby ​​или python - PullRequest
4 голосов
/ 09 мая 2009

Популярный текстовый редактор имеет следующую функцию «поиск в файлах», которая открывается в диалоговом окне:

 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, который принимает те же или похожие аргументы простого ввода и выполняет то, что вы ожидаете?

Я ищу что-то, что выполняет грубый линейный поиск, ничего общего с индексированным поиском.

Ответы [ 2 ]

5 голосов
/ 09 мая 2009

Я знаю, что вы сказали, что вам не хочется писать это самостоятельно, но для чего бы это ни стоило, было бы очень легко использовать 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, кстати)

3 голосов
/ 09 мая 2009

Grepper - драгоценный камень Ruby Дэвида А. Блэка, который делает именно это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...