Perl CLI regex的输出保存到fi

2024-05-18 21:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想打印输出到文本文件与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})'

谢谢你的帮助和提示


Tags: testtxtclientmacperlcatclientssubprocess
2条回答

好的,您已经将其标记为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是上下文的,而正则表达式不是上下文的。解析器是您应该使用的工具

只要使用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))

相关问题 更多 >

    热门问题