PowerShell:在文本文件中,将此行作为上一行的一部分

PowerShell:在文本文件中,将此行作为上一行的一部分

导致这一请求的情况并不十分重要(阅读:请不要给我指点如何避免这种情况,我已经尝试过了)但我有一个生成文本文件的引擎。例如,这些文件通常如下所示:

ENTRY: XYZ
COMMENT: This is a comment
ENTRY: 123
INTEGER: 4

但有时我们处理的数据包含换行符,因此文本文件如下所示:

ENTRY: XYZ
COMMENT: This is a comment
that spans over multiple lines
just to make life difficult
ENTRY: 123

我正在寻找的是一些可以处理整个文本文件的 PowerShell,并说“对于不包含字符的行:,将此行作为其前一行的一部分,可能用或其他东西替换换行符::以使其清晰”。 寻求的最终结果是:

ENTRY: XYZ
COMMENT: This is a comment :: that spans over multiple lines :: just to make life difficult
ENTRY: 123

到目前为止,我一直在使用Get-Content | % {$_ etc},但 % 将内容拆分为单独的行。我不相信%?没有任何上下文感知,因此不可能说“其中对象匹配 xyz 使其成为最后一个对象的一部分”。

我花了很长时间尝试使用行号。我的伪代码是:

  • 当文档包含不包含冒号的行时,获取第一行不包含冒号的行的行号
  • 将前一行的行号设置为包含其数据和有问题行的数据

但是,前一种操作会打乱行数,这意味着每次我进行这种调整时,我都需要重新计算各个行号。此外,“当文档包含不以冒号开头的行时”可能是一个非常耗费系统资源的过程(这些文档可能非常大),这很可能酿成灾难。

答案1

以下是基于正则表达式的解决方案的示例:

(Get-Content -Raw test.txt) -Replace '\n([^\n:]+)(?=\n)', ' :: $1' | Out-File test.txt

首先,您使用标志加载整个文件-Raw。然后,正则表达式匹配换行符 ( \n),非换行符或未:在组中捕获的字符([^\n:]+),最后,我们对换行符进行正向前瞻(?=\n),确保在换行符处停止,但跳过换行符进行完整匹配,以便下一个\n匹配下一行。然后,我们使用捕获的组进行适当的替换,并将其输出到同一个文件。

相关内容