【问题标题】:Extract substrings where match is found提取找到匹配的子字符串
【发布时间】:2015-10-19 07:05:29
【问题描述】:

我有一个包含多行的文本文件。我想单独搜索每一行以查找特定模式,如果找到该模式,则在相对于找到该模式的位置的特定位置输出一个子字符串。

即如果一行包含位置 20 的模式,我想输出从同一行的位置 25 开始并持续五个字符的子字符串。

以下代码将输出包含该模式的每一行:

select-string -path C:\Scripts\trimatrima\DEBUG.txt -pattern $PATTERN 

我从这里去哪里?

【问题讨论】:

标签: string powershell search substring powershell-3.0


【解决方案1】:

你可以使用$Matches自动变量:

最后一个匹配存储在$Matches[0],但您也可以使用命名捕获组,如下所示:

"test","fest","blah" |ForEach-Object {
    if($_ -match "^[bf](?<groupName>es|la).$"){
        $Matches["groupName"]
    }
}

返回es(来自“fest”)和la(来自“blah”)

【讨论】:

    【解决方案2】:

    几个选项。

    保留Select-String,您需要使用.line 属性来获取子字符串:

    select-string -path C:\Scripts\trimatrima\DEBUG.txt -pattern $PATTERN |
     foreach { $_.line.Substring(19,5) }
    

    对于大文件,Get-Content-ReadCount-match 可能更快:

    Get-Content C:\Scripts\trimatrima\DEBUG.txt-ReadCount 1000 |
     foreach {
      $_ -match $pattern |
      foreach { $_.substring(19,5) }
      }
    

    【讨论】:

    • 我认为在后面提到积极的看法会有所帮助,因为使用您的第二种方法,他可以做类似GC $file -readcount 1000|ForEach{$_ -replace "(?&lt;=$Pattern).{5}(.{5})",'$1'} 的事情(也许即使没有 ForEach?我不确定,你会比我更清楚)
    • 你不需要做后面的事情。只需添加行锚的开头,并为前 20 个字符添加通配符。
    • 从他的原始帖子中,我的印象是字符串可以位于行中的任何位置,并且他想要在模式之后的 5 个字符的子字符串,无论模式是否被发现。我可能误会了。
    • 我也是这么读的。在我发布此答案后,问题似乎已被编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2023-03-17
    • 2019-11-19
    • 1970-01-01
    • 2020-12-06
    • 2014-06-08
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多