如何用sed匹配k__开头到空格的内容并移动至行尾
问题排查
你的调整捕获组顺序的思路是完全可行的,原命令没有生效是正则规则存在几处错误:
- 第一个捕获组
(.*k__)多包含了目标字段的开头k__,导致第二个捕获组匹配错位 - 启用
-E扩展正则模式时,量词+不需要转义,你写的\w\+会被识别为匹配字面量加号,无法正常匹配多字符 - 没有正确匹配目标字段前后的分隔空格,会导致替换后出现多余或缺失空格的问题
正确实现方案
命令写法
macOS下使用gsed:
gsed -E 's/^(.*?)\s+(k__[^ ]+)\s+(.*)$/\1 \3 \2/' test.file
Linux下使用原生sed:
sed -E 's/^(.*?)\s+(k__[^ ]+)\s+(.*)$/\1 \3 \2/' test.file
如果需要直接修改原文件,加上-i参数即可,以gsed为例:
gsed -i -E 's/^(.*?)\s+(k__[^ ]+)\s+(.*)$/\1 \3 \2/' test.file
规则说明
^匹配行的起始位置(.*?)第一个捕获组,非贪婪匹配行开头到目标字段前的所有内容(即示例中的数字ID部分)\s+匹配目标字段前的一个或多个分隔空格(k__[^ ]+)第二个捕获组,匹配k__开头、截止到首个空格的目标字符串,[^ ]+代表匹配所有非空格字符\s+匹配目标字段后的一个或多个分隔空格(.*)$第三个捕获组,匹配目标字段后到行尾的所有剩余内容- 替换逻辑
\1 \3 \2将目标字段移动到剩余内容的末尾,保持其他内容顺序不变
内容的提问来源于stack exchange,提问作者LP_640
相关产品推荐
相关产品推荐

