【发布时间】:2022-01-26 09:04:33
【问题描述】:
我尝试创建一个多行输入来练习Select-String,希望只输出一个匹配的行,就像我通常会在echo -e ... | grep 组合中看到它一样。但是下面的命令仍然给了我这两行。似乎换行符仅在最终输出上解释,Select-String 仍然得到单行输入
Write-Output "Hi`nthere" | Select-String -Pattern "i"
#
# Hi
# there
#
#
虽然我希望它只会返回
Hi
我使用了这个版本的 PowerShell:
Get-Host | Select-Object Version
# 5.1.19041.906
与bash 相比,我将执行以下操作来测试 bash 中多行输入的命令。我通常使用echo -e 生成多行,然后grep 处理各个行。
echo -e "Hi\nthere" | grep "i"
# Hi
我希望有人能解释一下我在 PowerShell 中错过了什么?这个问题对我来说似乎是一个基本的误解,我也不确定 Google 是为了什么。
编辑
[edit 1]:问题也适用于以回车符结尾的行
Write-Output "Hi`r`nthere" | Select-String -Pattern "i"
我看到用逗号分隔可以作为有效的多行输入。所以也许问题是如何从换行转换为实际的输入行分隔。
Write-Output "Hi","there" | Select-String -Pattern "i"
# Hi
[edit 2]: 从 edit 1 我找到了this stackoverflow-answer,现在对我来说它可以在哪里使用
Write-Output "Hi`nthere".Split([Environment]::NewLine) | Select-String -Pattern "i"
# or
Write-Output "Hi`nthere".Split("`n") | Select-String -Pattern "i"
仍然有人可以解释为什么这与此处相关,但在bash 中不相关?
【问题讨论】:
-
echo -e …in bash:-e表示启用some backslash-escaped characters的解释。 PowerShell 等效项(大致不完整):Write-Output ("Hi`nthere" -split "`r|`n") | Select-String -Pattern "i" -
Select-String operates on its input objects individually,这意味着您需要首先使用(("Hi`nthere" -split '\r?\n') | Select-String -Pattern "i").Line将多行字符串拆分为单独的行。解释见this answer -
感谢@JosefZ 和@Theo,尤其是@JosefZ 向我指出“-e”的详细解释,这似乎是我正在寻找的实际解释。所以 bash 中的
-e等价于-split "`r|`\n") -
重新考虑这个...我实际上更喜欢`-split "`r?`n"
标签: bash powershell grep select-string