如何在Powershell中移除波浪线分隔文件记录内的JSON文本(含CRLF)
实现方案
核心处理逻辑
- 因为原始记录内部自带不规则换行(内嵌JSON换行、请求头换行),逐行读取会把单条完整记录拆成多段,因此不采用逐行读取的方式,而是先把整个文件读为单一大字符串,抹除所有内置的CR/LF换行符,把被拆散的记录重新拼接为连续文本。
- 用记录固定的末尾结构(UUID格式哈希值 + 标准12小时制时间戳)作为拆分锚点,不受中间冗余内容(JSON、请求头、SubscriberId字段)的干扰,统一拆分出独立的完整记录。
- 对拆分完成的单条记录,按固定规则提取需要保留的四个字段,直接丢弃冗余内容。
可直接运行的Powershell代码
# 替换为你的实际文件路径 $inputFile = "C:\logs\raw_source.txt" $outputFile = "C:\logs\cleaned_result.txt" # 读取全量内容并合并所有零散行,抹除所有内置换行 $rawText = Get-Content $inputFile -Raw $flatText = $rawText -replace "`r`n|`n|`r", "" # 正则匹配单条记录的目标字段,非贪婪匹配避免跨记录捕获 $matchRule = "(?<test_plan>.*?)~(?<resp_status>.*?),Response Content:.*?(?<hash_id>[\w-]{36})~(?<time_stamp>\d{1,2}/\d{1,2}/\d{4}\s+\d{1,2}:\d{2}:\d{2}\s+(AM|PM))" # 提取并拼接清洗后的记录 $cleanedData = [regex]::Matches($flatText, $matchRule) | ForEach-Object { $plan = $_.Groups["test_plan"].Value $status = $_.Groups["resp_status"].Value $hash = $_.Groups["hash_id"].Value $ts = $_.Groups["time_stamp"].Value "$plan~$status~$hash~$ts" } # 写入结果文件 $cleanedData | Out-File $outputFile -Encoding utf8
适配说明
- 代码兼容两类待处理记录:无论记录中间是否存在多行JSON、请求头换行,只要存在
",Response Content:"标记、末尾带固定格式的36位哈希值与时间戳,都会被正确识别,无需单独分支处理JSON结构。 - 如果实际场景中哈希值长度不是固定36位,只需调整正则中
[\w-]{36}的长度数字为实际值即可。 - 采用非贪婪匹配模式,避免单条正则跨多个相邻记录捕获异常内容。
内容的提问来源于stack exchange,提问作者Jack Black
相关产品推荐
相关产品推荐

