Найти и заменить регулярное выражение в текстовом файле (ma c адресов) - PullRequest
0 голосов
/ 02 августа 2020

Об этом спрашивали в других местах, но без всякой радости пробовать эти решения. Я пытаюсь выполнить поиск и заменить, используя 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, но я не могу отобразить прогресс, поэтому попробуйте использовать выше. Еще раз спасибо!

1 Ответ

0 голосов
/ 02 августа 2020

Все, разобрался. Публикация рабочего кода на случай, если кто-то обнаружит это сообщение.

#!/usr/bin/env python3
#Rewriting Sanitizer script from bash
#Import Modules, trying to not download any additional packages.  Using regex to make this python2 compatible (does not have ipaddress module).

import sys
import getopt
import re
import socket
import os
import fileinput
import time

#Usage Statement sanitize.py /path/to/file, add help statement
#Test against calling entire directories, * usage

#Variables
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]?)$'

#Functions

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:
        lines = i.readlines()
        
    with open(file, 'w') as i:
        for line in lines:
                line = re.sub(regmac, "MAC ADDRESS WAS HERE", line)
                i.write(line)
        i.close()
    break

Вышеупомянутое перезаписывает совпадение регулярного выражения (найдено MA C адрес) на «MA C АДРЕС БЫЛ ЗДЕСЬ». Надеюсь, это кому-то поможет. Приветствуются любые предложения по повышению эффективности этого или другого способа выполнения sh. Помечу как ответ, как только смогу, 2 дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...