如何使用Powershell从多行中选择字符串



我在的test.dat下面有这个文件

<category>Games</category>
</game>
<category>Applications</category>
</game>
<category>Demos</category>
</game>
<category>Games</category>
<description>MLB 2002 (USA)</description>
</game>
<category>Bonus Discs</category>
</game>
<category>Multimedia</category>
</game>
<category>Add-Ons</category>
</game>
<category>Educational</category>
</game>
<category>Coverdiscs</category>
</game>
<category>Video</category>
</game>
<category>Audio</category>
</game>
<category>Games</category>
</game>

如何使用Get-ContentSelect-String从上面文件的输入向终端输出以下内容。使用上面的输入,我需要接收这个输出。

<category>Games</category>
</game>
<category>Games</category>
</game>

这是我当前使用的命令,但它不起作用。Get-Content '.test.dat' | Select-String -pattern '(^s+<category>Games</category>n^s+</game>$)'

首先需要将其作为一个字符串读取,以便在行之间进行匹配。

Get-Content '.test.dat' -Raw

既然你似乎想用排除条目,你可以使用这个模式,只抓取那些在之后和之前没有空白的条目

'(?s)s+<category>GamesS+r?n</game>'

Select字符串返回一个matchinfo对象,您需要提取Matches属性的Value属性。你可以用几种不同的方法来做到这一点。

Get-Content '.test.dat' -Raw |
Select-String '(?s)s+<category>GamesS+r?n</game>' -AllMatches |
ForEach-Object Matches | ForEach-Object Value

$output = Get-Content '.test.dat' -Raw |
Select-String '(?s)s+<category>GamesS+r?n</game>' -AllMatches
$output.Matches.Value

(Get-Content '.test.dat' -Raw |
Select-String '(?s)s+<category>GamesS+r?n</game>' -AllMatches).Matches.Value

输出

<category>Games</category>
</game>

<category>Games</category>
</game>

您也可以使用[regex]类型的加速器。

$str = Get-Content '.test.dat' -Raw
[regex]::Matches($str,'(?s)s+<category>GamesS+r?n</game>').value

编辑

根据你的额外信息,我的理解是你想删除任何空的游戏类别。我们可以通过使用here字符串来大大简化这一过程。

$pattern = @'
<category>Games</category>
</game>
'@

额外的空行旨在捕获最后一个换行符。你也可以这样写

$pattern = @'
<category>Games</category>
</game>r?n
'@

现在,如果我们对模式进行替换,你会看到我相信你对最终结果的期望。

(Get-Content $inputfile -Raw) -replace $pattern

为了完成它,您只需将上面的命令放在Set-Content命令中即可。由于Get-Content命令包含在括号中,因此在将文件写入之前,它将被完全读取到内存中

Set-Content -Path $inputfile -Value ((Get-Content $inputfile -Raw) -replace $pattern)

编辑2

它似乎在ISE中工作,但在powershell控制台中不工作。如果你遇到同样的事情,试试这个。

$pattern = '(?s)s+<category>Games</category>r?ns+</game>'
Set-Content -Path $inputfile -Value ((Get-Content $inputfile -Raw) -replace $pattern)

相关内容

  • 没有找到相关文章

最新更新