Вывод из Perl CLI регулярного выражения сохранить в файл - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы напечатать вывод в текстовый файл с кодом Python.

cat test-01.kismet.netxml | perl -ne 'while(m/(?<\client-mac\>)(.*)(?=\<\/client-mac\>)/g{print $&; print "\n"})'

Результат - то, что я хочу:

FF:FF:FF:FF:FF:FF
FF:FF:FF:FF:FF:FF

Я хотел бы иметь что-то вроде этого:

proc = subprocess.Popen([["cat", "test-01.kismet.netxml", "|", "perl", "-new", "'while(m/(?<\client-mac\>)(.*)(?=\<\/client-mac\>)/g{print $& > clients.txt; print "\n" > clients.txt})'"], stdout=subprocess.PIPE, shell=True)

Но это не работает.

Проблема будет в этой части:

'while(m/(?<\client-mac\>)(.*)(?=\<\/client-mac\>)/g{print $& > clients.txt; print "\n" > clients.txt})'

Спасибо за любую помощь или любую подсказку!

Ответы [ 2 ]

1 голос
/ 31 октября 2019

ОК, вы отметили это как perl, и у вас уже есть ответ на языке Python.

Итак, вот как вы это сделаете с perl:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

my $xml = XML::Twig -> parsefile ('test-01.kismet.netxml'); 
print $xml -> get_xpath('//client-mac', 0) -> text; 

Ноесли вы встраиваете его в python, хотя я ценю жестокую иронию «выкладывания» в perl, на самом деле вы должны просто придерживаться парсера Python.

Ключевым моментом является то, что XML является контекстным, а регулярные выражения - нет. Парсер - это инструмент, который вы должны использовать.

1 голос
/ 31 октября 2019

Просто используйте парсер xml, ваша жизнь станет намного проще:

import xml.etree.ElementTree as ET

xml_doc = ET.parse('test-01.kismet.netxml')

for client_mac_node in xml_doc.iter('client_mac'):
    print(client_mac_node.text)

Вывод в файл не сложнее:

clients_macs = [client_mac_node.text for client_mac_node in xml_doc.iter('client_mac')]

with open('clients.txt', 'w') as f:
    f.write('\n'.join(clients_macs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...