PowerShell Regex Multilined

时间:2015-05-08 01:56:19

标签: regex powershell

与Regex合作并打了一堵砖墙。

$AddressEdit = Select-String "c:\utilities\AddressStaged.txt" -pattern "^(?!<img src)"  | Select Line | Out-File "c:\utilities\Address.txt" 

上面返回我需要的一些数据。但是,文本文件中有一行总是出现在返回的这一行之后,我也想在输出中包含到一个新文档中。

我的问题:正则表达式是否有办法说“抓住这一行以及你从模式结果中找到的数据线下方的数据线”?

1 个答案:

答案 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>)'