Powershell使用Regex在XML中查找字符串中的字符串

时间:2012-10-23 05:24:35

标签: xml regex powershell substring

我有一个xml文件,我需要只读取主字符串中的特定子字符串。 xml文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Report Version="10.0">
<Entities>
<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">
<Mods>
<Mod Name="svcUtility.Host.dll" AssemblyVersion="1.0.2000.001">
<Fields>
<Field Name="TIndex" Value="100" />            
<Field Name="Vindex" Value="200" />
</Fields>
</Mod>
</Mods>
</Entity>
</Entities>
</Report>

此xml中的主要字符串是 -

<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">

我需要只打印“appname”。

我可以使用什么条件逻辑在powershell中使用正则表达式打印它?并且在appname之后总是不需要\ wcf ..它可以是基于dll路径的任何东西。对于Eg,它可以像:

<Entity Name="\\sharing\Data\*SB*\**appname**\**Web**\Utilitysvc\bin\svcUtility.Host.dll">

<Entity Name="\\sharing\Data\*SB*\*DEVCS*\**appname**\**junk**\Utilitysvc\bin\svcUtility.Host.dll">

我可以使用通用的select -string方式吗?  还需要对此进行测试..

谢谢,
阿希什

2 个答案:

答案 0 :(得分:2)

这是一种方式:

$xml = [xml](get-content .\my.xlm )

 ($xml.Report.Entities.Entity.name | 
% { [regex]::matches($_, 'SB\\(.*)\\wcf') } |
 select -expand groups)[1].value

没有[regex] .net方法:

($xml.Report.Entities.Entity.name |
select-string 'SB\\(.*)\\wcf' -AllMatches | select -ExpandProperty matches |
select -ExpandProperty groups)[1].value

编辑:

根据您的上一条评论尝试此模式:

 ($xml.Report.Entities.Entity.name |
    select-string '(?<=\\Data\\.*\\)[^\\]*' -AllMatches |
    select -ExpandProperty matches |
    select -ExpandProperty groups)[0].value

答案 1 :(得分:0)

你可以在没有正则表达式的复杂性的情况下做到这一点,拆分路径并抓住第5个元素(听起来像电影名称):

[xml]$xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Report Version="10.0">
<Entities>
<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">
<Mods>
<Mod Name="svcUtility.Host.dll" AssemblyVersion="1.0.2000.001">
<Fields>
<Field Name="TIndex" Value="100" />            
<Field Name="Vindex" Value="200" />
</Fields>
</Mod>
</Mods>
</Entity>
</Entities>
</Report>
"@

$xml.Report.Entities.Entity.Name.split('\')[5]

**appname**