Powershell按分隔符将文本文件分成几页

Powershell split text file into pages by delimiter

这里是 PowerShell 的新手。有一个大文本文件,目前有许多相似的页面重叠。希望使用分隔符:“TESTING/TEST SYSTEM”出现在每个页面的顶部以将它们分隔成单独的页面。原始原始源总是有一个 1 和 0。第一行是 1,第二行是 0,可能是一些旧的大型机系统,我不想使用 1 和 0 作为分隔符,因为我有其他文件希望 运行 此命令使用不同的分隔符,没有 1 和 0。

这是我目前在 Whosebug 上发现的部分内容:

(Get-Content -Raw inFile.txt) -split '(TESTING/TEST SYSTEM)'|
  Set-Content -LiteralPath { 'c:\test\outFile{0}.txt' -f $script:index++ }

但是,这会不断创建两个额外的文件。第一个文件只包含 1 和 0。第二个文件实际上包含分隔符,从每页的其余内容中剥离出来。第三个文件包含其余内容。重复此操作,直到所有页面都分开,为每个部分创建 3 页。我只需要分隔符成为每一页的一部分。 1 和 0 也可以是它的一部分,或者删除,以更容易的为准。非常感谢您的帮助!

(Get-Content -Raw inFile.txt) -split '(?=TESTING/TEST SYSTEM)' |
  Set-Content -LiteralPath { 'c:\test\outFile{0}.txt' -f $script:index++ }

注:

  • -split 总是匹配第一个分隔符匹配 之前 的内容;如果输入 以分隔符开始 ,则第一个数组元素 returned 是 ''(空字符串)。

    • 如果没有其他标记为空,或者如果可以/希望消除所有空标记,您可以简单地将 -ne '' 附加到 -split 操作。
  • 如果要区分大小写-敏感,请使用-csplit而不是-split

  • 如果要确保正则表达式仅匹配行首,请使用
    '(?m)(?=^TESTING/TEST SYSTEM)'

  • 分隔符正则表达式中的
  • (?=...) 是一个(正)look-ahead 断言 导致分隔符为 作为每个令牌的一部分包含在内,如下所述。


-split 运算符的二进制形式:

  • 默认情况下 排除(第一个)RHS 操作数 - 分隔符正则表达式 - 从令牌数组中匹配它 returns:

    'a@b@c' -split '@' # -> 'a', 'b', 'c'
    
  • 如果在分隔符正则表达式中使用捕获组(...)),捕获组匹配的是included 在 return 数组中,作为 单独的标记 :

    'a@b@c' -split '(@)' # -> 'a', '@', 'b', '@', 'c'
    
  • 如果您想将分隔符正则表达式匹配的内容 作为每个标记的一部分 ,您必须使用 look-around断言:

    • 在每个标记的 start 处查看-ahead 断言 ((?=...)):

      'a@b@c' -split '(?=@)' # -> 'a', '@b', '@c'
      
    • 在每个标记的 end 处查看 behind 断言 ((?<=...)):

      'a@b@c' -split '(?<=@)' # -> 'a@', 'b@', 'c'