Sed remove MA C адрес, обозначенный строками, включая ключевые слова - PullRequest
1 голос
/ 07 мая 2020

Я работаю над запутыванием адреса MA C в файле в строках, включая указанные c символы. Однако я хочу удалить его только в строках, обозначенных ключевым словом «событие». Для меня сложность состоит в том, что между «четным» ключевым словом и адресом MA C будет случайная длина ключевых слов (включая цифры и буквы). Поэтому я заменяю:

[random length combinations of words, numbers, potentially punctuation or space] "event" [random length combinations of words, numbers, potentially punctuation or space] "xx:xx:xx:xx:xx:xx" [random length combinations of words, numbers, potentially punctuation, nothing at all or space] 

на «x». Я знаю только, как скрыть адрес MA C:

sed -E 's/'([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}')/ x /g'

Но я не знаю, как измените его, чтобы скрыть его для указанных c строк. Например, у меня есть файл input.txt:

[INFO] device 1 event - client connected with aa:bb:8a:de:8e:23
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: aa:bb:8a:de:8e:23 success!

вывод должен быть:

[INFO] device 1 event - client connected with x
[ERROR] device 2 event - routing data to x failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: x success!

1 Ответ

3 голосов
/ 07 мая 2020

Вот одно возможное решение sed - которое позволяет event появляться в любом месте строки, это должно быть полное слово (а не часть более длинного слова, например eventful), и может быть несколько MA C адреса в строке - все они должны быть замаскированы, если слово event присутствует в той же строке. Я также использую xx:xx:xx:xx:xx:xx в качестве маски, но вы можете легко заменить это.

Я создал следующий входной файл для тестирования:

$ cat mac.input

[INFO] device 1 event - client connected with aa:bb:8a:de:8e:23
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: aa:bb:8a:de:8e:23 success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] aa:bb:aa:33:dd:1f is event 99:33:00:23:43:83 good

Как я уже упоминал, «адрес» во второй строке не будет маскироваться (даже если присутствует слово event), потому что адрес не является действительным адресом MA C для начала - g не является шестнадцатеричным di git. Адрес в строке [LINE] не будет маскироваться, потому что слово event само по себе отсутствует (хотя eventful есть). В последней строке есть два адреса MA C, и я замаскировал оба - даже тот, который появляется перед словом event. (Я попросил вас в комментарии уточнить, возможны ли такие ситуации, и если да, то как с ними обращаться; здесь я просто сделал случайный выбор, чтобы показать, что возможно.)

Итак, вот sed команда и ее вывод:

$ sed -E '/\bevent\b/
>   s/([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}/xx:xx:xx:xx:xx:xx/g' mac.input 

[INFO] device 1 event - client connected with xx:xx:xx:xx:xx:xx
[ERROR] device 2 event - routing data to gg:7a:e3:89:2f:2f failed
[LOG] device 3 connected 
[INFO] connected to 2 devices. event: xx:xx:xx:xx:xx:xx success!
[LINE] this was an eventful evening 22:33:22:33:22:33
[TWO MAC ADDRESSES] xx:xx:xx:xx:xx:xx is event xx:xx:xx:xx:xx:xx good
...