从中获取数据。
<IPv4 id="id456F07894780" name="XYZ" comment="stuf123" ro="False" address="1.1.1.1" netmask="255.255.255.255"/>
这是我的PS脚本。
$input_path = ‘c:\ps\search\fwbuilder.txt’
$output_file = ‘c:\ps\extracted_ip_addresses.txt’
$regex = '((?<=\bname="\b).*?(?=\".comment\b)|(?is)(?<=\baddress="\b).*?(?=\".netmask\b))'
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
我希望显示器像这样。
XYZ 1.1.1.1
但相反它显示为
XYZ
1.1.1.1 EDIT *************
我能够使用PS中的XML解析器完成我需要的工作。
Get-Content -Path C:\ ps \ search \ network.xml |选择-Xml -XPath //网络| Select-object -ExpandProperty&#34; node&#34; | Select-object&#34; name&#34;,&#34; address&#34;,&#34; netmask&#34;,&#34; id&#34;
感谢您的帮助。
答案 0 :(得分:2)
并非使用正则表达式无法完成,但您可能会使事情变得复杂。 (and regex really isn't the right tool for the job
如果你的输入是有效的xml,我会使用以下方法
[xml]'<IPv4 id="id456F07894780" name="XYZ" comment="stuf123" ro="False" address="1.1.1.1" netmask="255.255.255.255"/>' |
ForEach-Object {"$($_.IPv4.name) $($_.IPv4.address)"}
<强>输出强>
XYZ 1.1.1.1
应用于您的文件,以下可能是所有需要的
[xml](Get-Content c:\ps\search\fwbuilder.txt) | ForEach-Object {
"$($_.IPv4.name) $($_.IPv4.address)"
} | Out-File c:\ps\extracted_ip_addresses.txt
修改强>
根据您的评论,txt文件不包含根元素,您可以动态添加一个,如下所示
([xml]"<root>$(Get-Content c:\ps\search\fwbuilder.txt)</root>").root.IPv4 | ForEach-Object {
"$($_.name) $($_.address)"
}