MacOS下用gsed提取1-2字母前缀核心ID(含前置数字场景)
解决方法
你的问题根源在于正则的贪婪匹配:原命令中的.*会尽可能多匹配字符,导致双字母前缀ID的第一个字母被.*吃掉,只留下第二个字母和数字部分。同时需要适配前置非字母数字字符的场景,以下是修正后的方案:
修正后的命令
gsed -nE 's/.*(^|[^A-Z])([A-Z]{1,2}[0-9]+).*/\2/p' test
正则说明
-E:启用扩展正则表达式(ERE),避免大量转义字符,让正则更简洁。(^|[^A-Z]):匹配行首或者非大写字母的字符,确保捕获的1-2个大写字母前缀不会被更长的字母序列截断(比如避免从ABC123中错误提取BC123)。([A-Z]{1,2}[0-9]+):核心捕获组,匹配1-2个大写字母后跟至少一个数字(用+替代原命令的*,避免匹配仅含字母无数字的无效内容)。\2:引用第二个捕获组的内容,也就是需要提取的核心ID。
测试验证
针对你给出的场景:
- 输入
HQ544145,输出HQ544145 - 输入
24874:MH119974.1.<1.>606,输出MH119974 - 输入
U87391,输出U87391
性能优化(针对百万级记录)
直接指定文件名给gsed,避免使用cat管道(减少进程开销),这对百万条记录的处理效率提升更明显。
内容的提问来源于stack exchange,提问作者user95146
相关产品推荐
相关产品推荐

