导致此请求的情况并不是非常重要(阅读:请不要给我关于如何避免这种情况的指示,我已经尝试过)但我有一个生成文本文件的引擎。例如,这些文件通常如下所示:
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}
,但 % 将内容分成单独的行。我不相信%
或?
没有任何背景知识,所以不可能说where object match xyz make it part of the last object
。
我花了很长时间尝试使用行号。我的伪代码是while the document contains lines that do not contain a colon, get the line number of the first line not containing a colon and set the previous line number to contain both its data and the data of the offending line
;但是,前一个操作会扰乱行数,这意味着每次我进行此调整时,我都需要重新计算各个行号。除此之外,“虽然文档包含不以冒号开头的行”可能是一个系统密集型过程(这些文档可能非常大)并且它是灾难的根源。
这是基于正则表达式的解决方案的示例:
首先你用标志加载整个文件
-Raw
。然后正则表达式匹配一个换行符 (\n
),不是换行符或:
在组中捕获的字符([^\n:]+)
,最后我们对换行符有一个积极的前瞻性(?=\n)
,确保在它处停止但跳过它进行完整匹配,以便\n
匹配下一个为下一行。然后我们使用捕获的组进行适当的替换并将其输出到同一个文件。