powershell - Powershell 中 Select-String 方法的 "line"由什么构成?

标签 powershell split select-string

我希望 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"是一个包含两个元素的字符串数组,作为两个输入对象传递。
  • 为确保多行字符串的行单独传递,请使用 PowerShell 的 -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/

    相关文章:

    powershell - 在 PowerShell 中,如何发送邮件并在电子邮件正文中枚举发现的错误

    powershell - Lotusscript 删除用户并批准

    windows - 如何使用批处理文件分割字符串?

    c++ - Keprekar 数字

    java - 从mysql读取数据时如何在java中拆分 "\n"?

    powershell - 将索引号添加到 `Select-String`的结果列表中

    PowerShell Get-Content 基本操作太慢

    arrays - Powershell array .contains 方法似乎没有像宣传的那样工作

    Powershell - Select-String -Quiet 没有按预期工作?

    regex - 将文件中的关键字(模式)与多个文件进行匹配