导致这一请求的情况并不十分重要(阅读:请不要给我指点如何避免这种情况,我已经尝试过了)但我有一个生成文本文件的引擎。例如,这些文件通常如下所示:
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
匹配下一行。然后,我们使用捕获的组进行适当的替换,并将其输出到同一个文件。