为什么PowerShell-Replace在每行前面添加一个额外的空白



我在PowerShell中遇到-Replace的奇怪问题。该命令输出一个列表,经过过滤:

PS C:> dism /image:pro /Get-ProvisionedAppxPackages | Select-String -Pattern 'Nome'
Nome visualizzato: Microsoft.BingWeather
Nome visualizzato: Microsoft.DesktopAppInstaller
Nome visualizzato: Microsoft.GetHelp
Nome visualizzato: Microsoft.Getstarted
Nome visualizzato: Microsoft.HEIFImageExtension
Nome visualizzato: Microsoft.Messaging
Nome visualizzato: Microsoft.Microsoft3DViewer
Nome visualizzato: Microsoft.MicrosoftOfficeHub
Nome visualizzato: Microsoft.MicrosoftSolitaireCollection
Nome visualizzato: Microsoft.MicrosoftStickyNotes
Nome visualizzato: Microsoft.MixedReality.Portal
Nome visualizzato: Microsoft.MSPaint

输出非常干净(有些空行,此处不显示(。

当我尝试添加| % {$_ -Replace '[^:]+:',''}以替换:字符之后的所有字符时,在每行的开头都会向列表中添加一个额外的空格

PS C:> dism /image:pro /Get-ProvisionedAppxPackages | Select-String -Pattern 'Nome' | % {$_ -Replace '[^:]+:',''}
Microsoft.BingWeather
Microsoft.DesktopAppInstaller
Microsoft.GetHelp
Microsoft.Getstarted
Microsoft.HEIFImageExtension
Microsoft.Messaging
Microsoft.Microsoft3DViewer
Microsoft.MicrosoftOfficeHub
Microsoft.MicrosoftSolitaireCollection
Microsoft.MicrosoftStickyNotes
Microsoft.MixedReality.Portal
Microsoft.MSPaint

为什么?我可以用额外的| % {$_ -Replace 's+',''}来修复,但我想了解为什么会发生这种情况。

我的评论作为答案:

您看到的额外空格是冒号正后方的空格字符。正则表达式没有过滤掉这个空格,所以它仍然是输出中的第一个字符。

代替| % {$_ -Replace '[^:]+:',''},使用| % {$_ -replace '^.+:s*'}删除从启动到冒号的所有内容,并包括冒号和后面所有可能的额外空格字符。

最新更新