У меня есть куча ISO-образов на жестком диске, и все их содержимое занесено в текстовый файл в следующем формате:
<immage>.iso, <dir structure>/<filename>.<extension>
пример:
OS Backups.iso, ubuntu-12.04-desktop-i386.iso
OS Backups.iso, xubuntu-12.04-desktop-i386.iso
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso, documents/cost_estimates.xls
Pictures vacation 2011.iso, italy/img1.jpg
Pictures vacation 2011.iso, italy/img2.jpg
Теперь я хотите выполнить команду grep для этого текстового файла, чтобы найти файлы, содержащие «картинки» в своих именах. Ожидаемый результат будет (для предыдущего примера):
Pictures vacation 2011.iso
OS Backups.iso, background/pictures.jpg
Любые идеи о том, как сделать что-то подобное, используя grep? Альтернативы? Спасибо!
Вот то, как сделать это с grep, с помощью синтаксиса регулярного выражения Perl -P
, и переключатель return-only-matching-part -o
:
grep -Poi "(.*pictures.*\.iso.*pictures.*|.*pictures.*\.iso|.*pictures.*)" | sort | uniq
, который возвращается:
OS Backups.iso, background/pictures.jpg Pictures vacation 2011.iso
grep
первые проверки, если это .iso
файлы с "изображениями" на ее имя, , который также содержит файл с "изображениями" на ее имя, например: Pictures vacation 2011.iso, italy/pictures5.jpg
.iso
файлы с "изображениями" на его имя; $ awk -F ", " 'BEGIN { IGNORECASE=1 } $1 ~ /pictures/ { print $1 ; next } $2 ~ /pictures/ { print }' < context.txt | sort | uniq
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
#!/usr/bin/env python
import re, sys
a_file = sys.argv[1]
a_string = sys.argv[2]
#from http://www.peterbe.com/plog/uniqifiers-benchmark
def uniquify(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
mylist = []
with open(a_file, 'r') as items:
for line in items.readlines():
if (re.search(a_string, line, re.IGNORECASE)):
temp = line.split(',',1)
if (re.search(a_string, temp[0], re.IGNORECASE)):
mylist.append(temp[0])
else:
mylist.append(line.rstrip())
mylist = uniquify(mylist)
for item in mylist:
print(item)
Производит желаемый вывод, когда выполнено как python test.py index.txt pictures
import fileinput
import sys
lookFor = sys.argv[1]
for line in fileinput.input("textfile.txt"):
if lookFor in line:
print line
Можно запустить этот скрипт с python scriptName.py WORDTOLOOKFOR
Например, если я хочу проверить на строку в текстовом файле, содержащем слово "человечность", и сценарий называют script.py, который я пишу следующему
python script.py ubuntu
Обязательно переименуйте текстовый файл в сценарии.
Править: Это только распечатает строки, содержащие его, не сохранит его где угодно, во многом как то, что может сделать grep.