如何在PowerShell中将文本文件分割成两个?

5

我有一个包含脚本的文本文件,想要将其拆分成两个文件。

以下是虚构的脚本:

--serverone

this is first part of my script


--servertwo


this is second part of my script

我想创建两个文本文件,它们的外观如下:
文件1
--serverone

this is first part of my script

文件2

--servertwo


this is second part of my script

到目前为止,我已经在脚本中添加了一个我知道不存在的特殊字符(“}”)

$script = get-content -Path "C:\Users\shamvil\Desktop\test.txt"
$newscript = $script.Replace("--servertwo","}--servertwo")
$newscript.split("}")

但是我不知道如何将分割后的内容保存到两个不同的地方。

这可能不是最佳方法,因此我也对其他解决方案持开放态度。

请帮帮我,谢谢!

1个回答

7

使用基于正则表达式的 -split 操作:

$i = 0
(Get-Content -Raw test.txt) -split '(?m)^(?=--)' -ne '' |
  ForEach-Object { $fileName = 'file' + (++$i); Set-Content $fileName $_ }
  • 假设每个以以--开头的行开始的块都需要保存到单独的文件中。

  • Get-Content -Raw将整个文件读入一个多行字符串中。

  • 关于传递给-split的分隔符正则表达式:

    • (?m)内联正则选项使锚点^$每行上匹配
    • ^(?=--)因此匹配每一行以--开头的行,使用定义非捕获前瞻断言 ((?=...)) 确保--不会从结果块中删除(默认情况下,与分隔符正则表达式匹配的内容不会被包括在内)。
  • -ne '' 过滤掉由于分隔符表达式匹配到字符串的最开始而产生的额外空元素。

  • 请注意Set-Content不知道输入文件的字符编码,并使用其默认编码;如有需要,请使用-Encoding参数。


zett42 指出,可以通过使用延迟绑定脚本块参数来简化文件写入部分:

$i = 0
(Get-Content -Raw test.txt) -split '(?m)^(?=--)' -ne '' |
  Set-Content -LiteralPath { (Get-Variable i -Scope 1).Value++; "file$i" }
  • 通过调用 Get-Variable 来访问并增加父级作用域中的变量 $i 是必要的,因为延迟绑定脚本块(以及计算属性的脚本块)运行在一个子作用域中 - 也许有些令人意外,正如在GitHub问题#7157 中所讨论的那样。

    • 一个更短但更难理解的选项是改用([ref] $i).Value++;有关详细信息,请参见此答案
  • zett42 还指出了一个拟议的未来增强功能,可以通过引入反映当前管道对象序列号的自动变量 $PSIndex 来使手动维护序列号的需要不再存在: 参见GitHub issue #13772


1
@SantiagoSquarzon :) - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接