如何使用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-
相关产品推荐
相关产品推荐

