Подтвердить что ты не робот

Греп и Питон

Мне нужен способ поиска файла с помощью grep через регулярное выражение из командной строки Unix. Например, когда я ввожу в командной строке:

python pythonfile.py 'RE' 'file-to-be-searched'

Мне нужно регулярное выражение 'RE' для поиска в файле и распечатать соответствующие строки.

Вот код, который у меня есть:

import re
import sys

search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
        print line,
        if line == None:
            print 'no matches found'

Но когда я ввожу слово, которого нет, no matches found не печатает

4b9b3361

Ответ 1

Естественный вопрос - почему не просто использовать grep?! Но если вы не можете...

import re
import sys

file = open(sys.argv[2], "r")

for line in file:
     if re.search(sys.argv[1], line):
         print line,

Примечания:

  • search вместо match, чтобы найти где угодно в строке
  • запятая (,) после print удаляет возврат каретки (строка будет иметь один)
  • argv включает имя файла python, поэтому переменные должны начинаться с 1

Это не обрабатывает несколько аргументов (например, grep does) или расширяет подстановочные знаки (например, оболочка Unix). Если вам нужна эта функциональность, вы можете получить ее, используя следующее:

import re
import sys
import glob

for arg in sys.argv[2:]:
    for file in glob.iglob(arg):
        for line in open(file, 'r'):
            if re.search(sys.argv[1], line):
                print line,

Ответ 2

Краткая и эффективная память:

#!/usr/bin/env python
# file: grep.py
import re, sys

map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))

Это работает как egrep (без слишком большой обработки ошибок), например:

cat input-file | grep.py "RE"

А вот и одна строка:

cat input-file | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"

Ответ 3

Адаптировано из grep в python.

Принимает список имен файлов через [2:], не выполняет обработку исключений:

#!/usr/bin/env python
import re, sys, os

for f in filter(os.path.isfile, sys.argv[2:]):
    for line in open(f).readlines():
        if re.match(sys.argv[1], line):
            print line

sys.argv[1] resp sys.argv[2:] работает, если вы запустите его как автономный исполняемый файл, что означает

chmod +x

первый

Ответ 4

  • используйте sys.argv, чтобы получить параметры командной строки
  • использовать open(), read() для управления файлом
  • используйте модуль Python re для соответствия строкам

Ответ 5

Вам может быть интересно pyp. Ссылаясь на мой другой ответ:

"The Pyed Piper", или pyp, представляет собой текстовую манипуляцию в командной строке linux инструмент, подобный awk или sed, но который использует стандартную строку python и список, а также настраиваемые функции, разработанные для быстрого создания приводит к интенсивной производственной среде.

Ответ 6

Настоящая проблема в том, что переменная строка всегда имеет значение. Проверка на "не найдено совпадений" заключается в том, есть ли совпадение, поэтому код "if line == None:" следует заменить на "else:"