Об этом спрашивали в других местах, но без всякой радости пробовать эти решения. Я пытаюсь выполнить поиск и заменить, используя open (file) вместо ввода файла. Причина в том, что я печатаю сообщение «x of y завершено», когда оно работает (fileinput помещает его в файл, а не на терминал). Мой тестовый файл содержит 100 адресов ma c, разделенных новыми строками.
Все, что я хотел бы сделать, это найти регулярное выражение, соответствующее адресу ma c, и заменить его на «MA C ADDRESS WAS HERE ". Ниже приведено то, что у меня есть, и это только один раз помещает строку замены в конец файла.
#!/usr/bin/env python3
import sys
import getopt
import re
import socket
import os
import fileinput
import time
file = sys.argv[1]
regmac = re.compile("^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$")
regmac1 = "^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$"
regv4 = re.compile(r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')
regv41 = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
menu = {}
menu['1']="MAC"
menu['2']="IPV4"
menu['3']="IPV6"
menu['4']="STRING"
menu['5']="EXIT"
while True:
options=menu.keys()
sorted(options)
for entry in options:
print(entry, menu[entry])
selection = input("Please Select:")
if selection == '1':
print("MAC chosen...")
id = str('mac')
break
elif selection == '2':
print("IPV4 chosen")
id = str('ipv4')
break
elif selection == '3':
print("IPV6 chosen")
id = str('ipv6')
break
elif selection == '4':
print("String chosen")
id = str('string')
break
elif selection == '5':
print("Exiting...")
exit()
else:
print("Invalid selection!")
macmatch = 0
total = 0
while id == 'mac':
with open(file, 'r') as i:
for line in i.read().split('\n'):
matches = regmac.findall(line)
macmatch += 1
print("I found",macmatch,"MAC addresses")
print("Filtering found MAC addresses")
i.close()
with open(file, 'r+') as i:
text = i.readlines()
text = re.sub(regmac, "MAC ADDRESS WAS HERE", line)
i.write(text)
Вышеупомянутое будет помещать «MA C АДРЕС БЫЛ ЗДЕСЬ» в конце последней строки, пока не заменяя адреса MA C. Я чего-то принципиально упускаю. Если бы кто-то указал мне в правильном направлении, это было бы здорово!
предостережение, у меня это работает через fileinput, но я не могу отобразить прогресс, поэтому попробуйте использовать выше. Еще раз спасибо!