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'
这里是 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'