Греп и Питон
Мне нужен способ поиска файла с помощью 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
не печатает
Ответы
Ответ 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:"