我在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*'}
删除从启动到冒号的所有内容,并包括冒号和后面所有可能的额外空格字符。