与Regex合作并打了一堵砖墙。
$AddressEdit = Select-String "c:\utilities\AddressStaged.txt" -pattern "^(?!<img src)" | Select Line | Out-File "c:\utilities\Address.txt"
上面返回我需要的一些数据。但是,文本文件中有一行总是出现在返回的这一行之后,我也想在输出中包含到一个新文档中。
我的问题:正则表达式是否有办法说“抓住这一行以及你从模式结果中找到的数据线下方的数据线”?
答案 0 :(得分:2)
是的,你可以使用RegEx与多线匹配使用-Get-Content
的-Raw参数。
我给出了技术可行性的答案,从操作的角度来看,你应该遵循@TheMadTechnician或@David Brabant的建议。
这是一个XML文件(M.txt):
<?xml version="1.0" encoding="utf-8"?>
<Machines xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Machine>
<Nom>JPBHPP2.marceau.fr</Nom>
<IP>192.168.2.61</IP>
<Creation>2014-06-05T06:35:25.2318584+02:00</Creation>
<Masque-IPv4>255.255.255.0</Masque-IPv4>
</Machine>
<Machine>
<Nom>JPBASUSF2.marceau.fr</Nom>
<IP>192.168.2.81</IP>
<Creation>2014-06-05T06:35:20.7676768+02:00</Creation>
<Masque-IPv4>255.255.255.0</Masque-IPv4>
</Machine>
</Machines>
现在将文件作为单个字符串加载:
$a = Get-Content D:\temp\M1.xml -Raw
然后试试这个RegEx:
$reg = [regex]'(?sm) (<Nom>.*?</Nom>\r\n.*?\r\n)'
它给出了:
$reg.Matches($a).count # gives 2
$reg.Matches($a).Groups[0].value
# gives
# <Nom>JPBHPP2.marceau.fr</Nom>
# <IP>192.168.2.61</IP>
更新以回答您的问题:是否可以从正则表达式开始并以正则表达式结束并收集所有内容?这是一种在<Nom>
和</IP>
之间取得所有内容的方法。
$reg = [regex]'(?sm)(<Nom>.*?</IP>)'