如何使用SED提取指定长度子串并将16位数字拆分为两个8位段
sed命令调整方案
不需要使用sed以外的工具,直接修改正则匹配规则即可实现需求。
你原命令未得到预期结果的核心原因是:第二个捕获组使用.*做贪婪匹配,会一次性捕获两个下划线之间的全部16位数字串,没有做拆分。结合你提到的「中间数字段固定16位、需拆分为两个等长8位段」的前提,直接把捕获规则改为按固定长度匹配即可。
可直接运行的命令
echo "abcd_2222222233333333_jdkj" | sed -e 's/^\(.*\)_\([0-9]\{8\}\)\([0-9]\{8\}\)_\(.*\)$/\2-\3_\1_\4/'
执行输出
运行上述命令后将直接返回你需要的结果:
22222222-33333333_abcd_jdkj
正则逻辑说明
调整后的正则把原来的3个捕获组拆分为4个:
- 第1组
\(.*\):匹配第一个下划线前的前缀字符串(示例中为abcd) - 第2组
\([0-9]\{8\}\):匹配中间数字段的前8位 - 第3组
\([0-9]\{8\}\):匹配中间数字段的后8位 - 第4组
\(.*\):匹配最后一个下划线后的后缀字符串(示例中为jdkj)
替换阶段直接按目标顺序拼接捕获组,在第2、3组之间插入-即可。
如果中间16位段可能包含非数字字符,可以把[0-9]替换为.匹配任意字符,命令写法如下:
echo "abcd_2222222233333333_jdkj" | sed -e 's/^\(.*\)_\(.\{8\}\)\(.\{8\}\)_\(.*\)$/\2-\3_\1_\4/'
内容的提问来源于stack exchange,提问作者user19277079
相关产品推荐
相关产品推荐

