我在的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-Content
和Select-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)