合并首段重复多行数据方案求助?Notepad++/PowerShell正则尝试失败
解决相同前缀行的合并需求(Notepad++正则 + PowerShell方案)
我来帮你搞定这个合并相同前缀行的需求!不管是Notepad++的正则替换,还是PowerShell脚本,都能完美实现你要的选项A(带空格分隔)和选项B(无空格分隔)效果,咱们一步步来。
一、Notepad++ 正则解决方案
首先要确保Notepad++的正则设置正确:打开「替换」窗口(快捷键Ctrl+H),选择「正则表达式」模式,并且勾选**. matches newline**(这个非常重要,否则无法跨多行匹配)。
选项B:无空格拼接内容
使用以下正则进行替换,重复点击「替换所有」直到没有匹配项:
- 查找内容:
^([^;]+;)(.*)\R\1(.+) - 替换为:
\1\2;\3
每次替换会把两行相同前缀的内容合并成一行,重复操作后,所有同前缀的行就会被合并成一行,内容用分号直接连接。
- 查找内容:
选项A:带空格拼接内容
和上面的步骤一样,只是替换内容改成带空格的格式:
- 查找内容:
^([^;]+;)(.*)\R\1(.+) - 替换为:
\1\2 ;\3
正则含义解释
^([^;]+;):捕获每行开头的前缀部分(从行首到第一个分号)(.*):捕获第一行分号后的内容\R:匹配换行符(兼容Windows/Linux的换行格式)\1:匹配和捕获组1完全相同的前缀,确保是同组行(.+):捕获第二行分号后的内容
二、PowerShell 脚本解决方案
如果需要批量处理或者更灵活的操作,PowerShell的分组拼接方法更可靠,不会像正则那样需要多次替换。
选项B:无空格拼接
将以下脚本保存为.ps1文件,或者直接在PowerShell控制台运行(替换input.txt和output_optionB.txt为你的实际文件路径):
# 读取输入文件 Get-Content "input.txt" | ForEach-Object { # 按分号分割为前缀和内容(只分割一次) $parts = $_ -split ';', 2 # 生成自定义对象存储前缀和内容 [PSCustomObject]@{ Prefix = $parts[0] Content = $parts[1] } } | Group-Object -Property Prefix | ForEach-Object { # 将同组的内容用分号拼接 $mergedContent = $_.Group.Content -join ';' # 拼接前缀和合并后的内容 "$($_.Name);$mergedContent" } | Set-Content "output_optionB.txt"
选项A:带空格拼接
只需要把脚本中的-join ';'改成-join ' ;'即可:
Get-Content "input.txt" | ForEach-Object { $parts = $_ -split ';', 2 [PSCustomObject]@{ Prefix = $parts[0] Content = $parts[1] } } | Group-Object -Property Prefix | ForEach-Object { $mergedContent = $_.Group.Content -join ' ;' "$($_.Name);$mergedContent" } | Set-Content "output_optionA.txt"
为什么你之前的正则没生效?
你尝试的正则^([^;]+;).+\R(.*?\1.+(?:\R|$))+替换为\2,问题在于捕获组的范围错误:这个正则只捕获了最后一个匹配行的内容,而没有把所有同前缀行的内容都拼接起来,所以最终只保留了每组的最后一行内容,而不是所有内容的合并。
内容的提问来源于stack exchange,提问作者Batscha
相关产品推荐
相关产品推荐

