You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sed交换数字串中第4位与第7位的位置?

用sed交换数字串中任意位置的字符

嘿,你之前尝试交换数字串前两位的思路没问题,但有个小细节需要修正:你写的sed 's/\(\.\)\(\.\)/\2\1/'里的\.是用来匹配点号的,而我们要处理的是数字(其实是任意单个字符),所以应该去掉反斜杠,用.匹配任意单个字符。正确的交换前两位的命令应该是:

sed 's/\(.\)\(.\)/\2\1/' <<< "12345678"

运行后就能得到你想要的21345678啦~

接下来聊聊怎么交换更远位置的字符,核心就是利用sed的分组捕获功能——用\( \)把需要保留的片段分别“打包”,然后在替换的时候调换目标片段的顺序就行。我给你举几个实用的例子:

示例1:交换第1位和第5位

原数字串是12345678,我们想把第1位的1和第5位的5交换,得到52341678。对应的命令是:

sed 's/^\(.\)\(...\)\(.\)/\3\2\1/' <<< "12345678"

拆解一下逻辑:

  • ^ 锚定字符串开头,确保我们从第1位开始匹配
  • \(.\) 捕获第1位的1(记为分组1)
  • \(...\) 捕获中间第2-4位的234(分组2)
  • \(.\) 捕获第5位的5(分组3)
  • 替换时用\3(分组3的5)+\2(分组2的234)+\1(分组1的1),刚好完成交换。

示例2:交换第3位和第7位

如果想把第3位的3和第7位的7交换,让12345678变成12745638,命令可以这么写:

sed 's/^\(..\)\(.\)\(...\)\(.\)/\1\4\3\2/' <<< "12345678"

解释下:

  • \(..\) 捕获前2位的12(分组1)
  • \(.\) 捕获第3位的3(分组2)
  • \(...\) 捕获第4-6位的456(分组3)
  • \(.\) 捕获第7位的7(分组4)
  • 替换时按分组1 + 分组4 + 分组3 + 分组2的顺序拼接,就实现了两个位置的交换。

通用方法总结

不管你要交换哪两个位置(假设是第m位和第n位,且m < n),都可以按照这个思路来:

  • 先捕获第1到m-1位的内容,用\(.{k}\)(k是m-1,比如m=3时k=2,就是\(..\))
  • 捕获第m位:\(.\)
  • 捕获第m+1到n-1位的内容,用\(.{p}\)(p是n - m -1,比如m=3、n=7时,p=3,就是\(...\))
  • 捕获第n位:\(.\)
  • (可选)如果后面还有字符,捕获第n+1位到结尾的内容:\(.*\)
  • 替换时把第m位和第n位对应的分组调换位置,其他分组保持原来的顺序就行。

这样不管两个位置隔多远,都能精准交换字符啦~

内容的提问来源于stack exchange,提问作者Miracle-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:29:44