【问题标题】:Powershell searching for line termination using Select-StringPowershell 使用 Select-String 搜索行终止
【发布时间】:2020-06-01 18:44:26
【问题描述】:

我使用的是 PS v5.1

通常,如果我想搜索包含字符串的文件,我会使用这种模式:

Get-ChildItem -recurse | Select-String "searchstring"

如果我要搜索的是行终止字符 (\r\n),这似乎不起作用。 Select-String 文档状态:

Select-String 基于文本行。默认情况下,Select-String 在每一行中查找第一个匹配项,并且对于每个匹配项,它会显示文件名、行号以及包含匹配项的行中的所有文本。

因此,sls 似乎“有帮助”删除了我的行终止字符。 我可以这样做:

gci *|get-content -raw|sls "\r\r\n" -list

但这根本不一样,因为它丢失了文件名。我知道我可以写一个更长的 foreach 结构,例如:

foreach ($f in (gci -recurse *)) {
    if ($f.PSIsContainer) {
        continue
        }
    $c = Get-Content -raw $f.FullName
    if ($c.Length -ne 0) {
        $i = $c.IndexOf("`r`r`n")
        if ($i -gt 0) {
            Write-Output $f.FullName
            }
        }
    }

但这对于我想做的事情来说似乎相当冗长和复杂。

有没有更好的(比如简洁的单行)方法来进行这种类型的搜索?

【问题讨论】:

    标签: powershell powershell-5.0


    【解决方案1】:

    确实,Select-String 设计为在将文件信息对象作为输入时对单独的行进行操作,因此您不能以这种方式检查换行符。

    Get-Content -Raw 允许您以单个字符串的形式读取整个文件,并且 PowerShell 的文件系统提供程序还将 NoteProperty 成员添加到该字符串,特别是反映输入文件路径的 .PSPath 属性。

    您可以在每个文件内容字符串上使用-match 运算符而不是Select-String 来查找感兴趣的序列,并在匹配时回显.PSPath 属性值:

    Get-ChildItem -File -Recurse | Get-Content -Raw | ForEach-Object {
      if ($_ -match '\r\r\n') { Convert-Path $_.PSPath }
    }
    

    请注意,Convert-Path 需要将.PSPath 中报告的 PowerShell 提供程序限定路径(例如,Microsoft.PowerShell.Core\FileSystem::C:\Users\jdoe\file.txt)转换为本机文件系统路径(例如,C:\Users\jdoe\file.txt)。
    (这只是必要的,因为输入文件信息对象是通过管道提供的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多