Powershell通过分隔符将文本文件拆分为多个页面



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

以下是我迄今为止在StackOverflow上发现的,并且正在部分工作:

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

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

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

注:

  • -split总是在第一个分隔符匹配之前匹配;如果输入以分隔符开头,则返回的第一个数组元素是''(空字符串(。

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

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

  • 分隔符正则表达式中的(?=...)是一个(正(前瞻性断言,它会导致分隔符被作为每个标记的一部分,如下所述。


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

  • 默认情况下,从返回的标记数组中排除(第一个(RHS操作数(分隔符正则表达式(匹配的内容:

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

    'a@b@c' -split '(@)' # -> 'a', '@', 'b', '@', 'c'
    
  • 如果您想将分隔符regex与匹配的内容作为每个令牌的一部分,则必须使用环视断言

    • 在每个令牌的开始处查看前面的断言((?=...)(:

      'a@b@c' -split '(?=@)' # -> 'a', '@b', '@c'
      
    • 在每个令牌的的断言((?<=...)(后面查看

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

最新更新