为什么Select-String会添加空行?

9
这里有一个最小化的复现示例。
期望结果:
PS C:\> ("a", "b")
a
b
PS C:\> ("a", "b") | Select-String "b"
b
PS C:\>

实际结果:

PS C:\> ("a", "b")
a
b
PS C:\> ("a", "b") | Select-String "b"

b


PS C:\>

正如您所看到的,第二个输出在匹配行前有一个空行,在匹配行后有两个空行。

为什么会这样?我该怎么办?

(注意:这只是一个最简示例。在我的实际代码中,我正在解析svn status输出未提交的文件,并且我遇到了同样的多余换行问题。)


你可以使用 | Select-Object -ExpandProperty Line 将其导出以去除换行符,但我不知道为什么它会添加换行符,所以我会等待其他人的答案... - Shaneis
这只是纯格式化内容。您不应该依赖特定的格式,而应该使用属性来获取所需的值。 - user4003407
@PetSerAl,您是在说Select-String会隐式地执行Format-*吗? :O - Shaneis
@Shaneis 不是。默认的 Out-Default 命令有隐式版本的 Format-* - user4003407
有趣!干杯 @PetSerAl - Shaneis
@PetSerAl:确实,我的错误在于假设结果是一个字符串。不过,如果Select-String想要成为findstrgrep易于使用的替代品,这仍然是一种不幸的默认格式选择。 - Heinzi
1个回答

14

奇怪输出的原因是Powershell全都是对象。在这种情况下,Select-String返回一个或多个MatchInfo对象。就像这样:

PS C:\> $o = ("a", "b") | Select-String "b"
PS C:\> $o

b


PS C:\> $o.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    MatchInfo                                System.Object

为了更加混淆,对ToString()的显式调用不会输出换行符:

PS C:\> $o.ToString()
b
PS C:\>

为了解决问题,可以这样查询MatchInfo的Line属性:

PS C:\>  ("a", "b") | Select-String "b" | % { $_.Line }
b
PS C:\>

请参见Keith Hill关于类似问题的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接