PowerShell Regex获取2个字符串之间的多个子字符串,并将它们写入带有序列号的文件

ldxq2e6h  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(80)

Old thread
我的问题是:
第一个
这对于只有一个-firstString和-secondString的情况是很好的,但是如何使用这个函数在编号的TXT中按时间顺序写入多个相同的字符串呢?

txt - file(with more sections of text):
Lorem
....
is
--> write to 001.txt
Lorem
....
is
--> write to 002.txt
and so forth....

而且剖面的结构被保留下来,并不在一条线上。
我希望有人能告诉我。谢谢。

mzsu5hc0

mzsu5hc01#

您引用的函数有几个限制(我在original answer上留下了反馈),最值得注意的是,它只报告了 * 一个 * 匹配。
假设有一个名为Select-StringBetween的改进函数(请参阅下面的源代码),您可以按如下所示解决问题:

$index = @{ value = 0 }
Get-ChildItem C:\Temp\test.txt |
  Select-StringBetween -Pattern 'Lorem', 'is' -Inclusive |
  Set-Content -LiteralPath { '{0:000}.txt' -f ++$index.Value }

Select-StringBetween源代码:

注意:语法部分仿照Select-String,定义函数后,运行Select-StringBetween -?查看语法;希望参数名称是不言自明的。

function Select-StringBetween {
  [CmdletBinding(DefaultParameterSetName='String')]
  param(
    [Parameter(Mandatory, Position=0)]
    [ValidateCount(2, 2)] 
    [string[]] $Patterns,
    [Parameter(Mandatory, ValueFromPipelineByPropertyName, ParameterSetName='File')]
    [Alias('PSPath')]
    [string] $LiteralPath,
    [Parameter(Mandatory, ValueFromPipeline, ParameterSetName='String')]
    [string] $InputObject,
    [switch] $Inclusive,
    [switch] $SimpleMatch,
    [switch] $Trim
  )
  
  process {

    if ($LiteralPath) {
      $InputObject = Get-Content -ErrorAction Stop -Raw -LiteralPath $LiteralPath
    }
  
    if ($Inclusive) {
      $regex = '(?s)(?:{0}).*?(?:{1})' -f 
                  ($Patterns[0], [regex]::Escape($Patterns[0]))[$SimpleMatch.IsPresent],
                  ($Patterns[1], [regex]::Escape($Patterns[1]))[$SimpleMatch.IsPresent]
    }
    else {
      $regex = '(?s)(?<={0}).*?(?={1})' -f 
                  ($Patterns[0], [regex]::Escape($Patterns[0]))[$SimpleMatch.IsPresent],
                  ($Patterns[1], [regex]::Escape($Patterns[1]))[$SimpleMatch.IsPresent]
    }
    
    if ($Trim) {
      [regex]::Matches(
        $InputObject,
        $regex
      ).Value.Trim()
    }
    else {
      [regex]::Matches(
        $InputObject,
        $regex
      ).Value
    }
  }

}

请注意,GitHub上还有一个待定的功能请求,要求将此功能直接添加到Select-String-请参阅GitHub issue #15136

相关问题