如何将这些powershell正则表达式匹配输出到同一行

时间:2017-03-14 05:22:36

标签: regex powershell

从中获取数据。

<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;

感谢您的帮助。

1 个答案:

答案 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)" 
}