正则处理连字符分隔文本:交换字段后按姓名分组插入空行
实现方案
你可以根据使用场景选择下面两种方案:
方案1:awk命令行处理(适合批量处理大文件)
直接执行以下命令即可得到目标结果:
awk -F ' - ' '{split($2, name_arr, " "); cur_surname = name_arr[length(name_arr)]; if(prev_surname != "" && prev_surname != cur_surname) print ""; print $0; prev_surname = cur_surname}' 输入文件路径 > 输出文件路径
逻辑说明:
- 以
-作为字段分隔符,拆分每行得到第二个字段为完整姓名 - 拆分完整姓名取最后一个词作为分组依据(姓氏,和你示例的分组规则匹配)
- 比对当前行姓氏与上一行姓氏,不一致时先输出空行再输出当前行,保证组间有空行分隔
- 如果你需要按完整全名分组,直接把分组依据替换为第二个字段
$2即可
方案2:编辑器正则替换(适合小文本手动处理)
适用于VS Code、Notepad++等支持多行正则匹配的编辑器,操作前确保你的文本已经是同姓氏连续排列的状态:
- 查找规则:
(^.*? - .*? (\S+) - .*\n)(?!.*? - \2 - ) - 替换规则:
$1\n
逻辑说明:
- 捕获整行内容和对应的姓氏分组
- 通过负向前瞻判断下一行姓氏与当前是否不同,匹配到组的最后一行时自动在末尾追加一个换行,实现组间插入空行的效果
- 如果你需要按完整全名分组,把查找规则改为
(^.*? - (.*?) - .*\n)(?!.*? - \2 - )即可
内容的提问来源于stack exchange,提问作者Gouraya4912
相关产品推荐
相关产品推荐

