我希望 Select-String
考虑 \r\n
(回车+换行) Powershell 中一行的结尾。
但是,如下所示,abc
匹配整个整个输入:
PS C:\Tools\hashcat> "abc`r`ndef" | Select-String -Pattern "abc"
abc
def
如果我将字符串分成两部分,则
Select-String
表现如我所料:PS C:\Tools\hashcat> "abc", "def" | Select-String -Pattern "abc"
abc
怎么给
Select-String
行以 \r\n
结尾的字符串,然后让这个 cmdlet 只返回那些包含匹配的字符串?
最佳答案
Select-String
对每个(按需字符串化[1])输入对象进行操作。 "abc`r`ndef"
是单个输入对象。"abc", "def"
是一个包含两个元素的字符串数组,作为两个输入对象传递。 -split
将字符串拆分为行数组。运营商:"abc`r`ndef" -split "`r?`n"
?
使 `r
可选,以便也正确处理 `n
-only(仅 LF,Unix 风格)行尾。)简而言之:
"abc`r`ndef" -split "`r?`n" | Select-String -Pattern "abc"
等效的,使用带有正则表达式 (regex) 转义序列的 PowerShell 字符串文字(
-split
的 RHS 是一个正则表达式):"abc`r`ndef" -split '\r?\n' | Select-String -Pattern "abc"
有点遗憾的是
Select-String
文档讨论了对文本行的操作,因为真正的操作单元是输入对象——正如我们所见,它们本身可能包含多行。据推测,这来自通过
Get-Content
提供输入对象的典型用例。 cmdlet,它会一一输出文本文件的行。请注意
Select-String
不直接返回匹配的字符串,而是将它们包装在 [Microsoft.PowerShell.Commands.MatchInfo]
中包含有关匹配的有用元数据的对象。然而,即使在那里也存在线条隐喻,因为它是
.Line
包含匹配字符串的属性。[1] 选读:How
Select-String
字符串化输入对象如果输入对象还不是字符串,则会将其转换为字符串,但可能不是您期望的方式:
粗略地说,
.ToString()
在每个非字符串输入对象上调用方法 [2],对于非字符串是 与您使用 PowerShell 的默认输出格式获得的表示不同 (后者是您在控制台上打印对象或使用
Out-File
时看到的内容,例如);相比之下,它与双引号字符串中的字符串插值获得的表示相同(当您在 "..."
中嵌入变量引用或命令时,例如 "$HOME"
或 "$(Get-Date)"
)。经常,
.ToString()
只生成对象类型的名称,不包含任何特定于实例的信息;例如,$PSVersionTable
字符串化为 System.Management.Automation.PSVersionHashTable
.# Matches NOTHING, because Select-String sees
# 'System.Management.Automation.PSVersionHashTable' as its input.
$PSVersionTable | Select-String PSVersion
如果您确实想逐行搜索默认输出格式 ,使用以下习语:
... | Out-String -Stream | Select-String ...
但是,请注意 对于非字符串输入,通过使用
Where-Object
查询属性来过滤输入,对于后续处理来说更健壮和更可取。健康)状况。 也就是说,
Select-String
有一个强有力的理由需要隐式申请 Out-String -Stream
字符串化,如 this GitHub feature request 中所述 .[2] 更准确地说,
.psobject.ToString()
被调用,按原样调用,或者 - 如果对象的 ToString
方法支持 IFormatProvider
-typed 参数 - 作为 .psobject.ToString([cultureinfo]::InvariantCulture)
以获得文化不变的表示 - 参见 this answer想要查询更多的信息。
关于powershell - Powershell 中 Select-String 方法的 "line"由什么构成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49964670/