Crane
Table_bottom

Search
Loading
Table_bottom

分类
Table_bottom

随机文章
Table_bottom

标签云
Table_bottom

最新评论
Table_bottom

链接
Table_bottom

功能
Table_bottom

sed实现n++

Crane posted @ 2012年4月16日 21:38 in Linux with tags sed , 5083 阅读

sed,按其名字,也就是个stream editor,就做各种字符串操作很在行,至于要做运算什么的那得是awk的事了,没想一时看到sed官网上居然有个这样的例子,把一个数字加1,使用sed来做,挺有意思的,瞄了一下,注解一下。
sed本身没有处理运算的支持,所以这个例子也是实际上使用了处理字符串的方法来模拟数学操作。主要思想就是考虑这两种情况:

    1. 如果最后一位不是9,那么只需要动一位,做一个对应替换就OK。
    2. 如果最后一位或者几位有9,那么就需要做标记,因为同时要替换好几位数字。


#!/usr/bin/sed -f

/[^0-9]/ d            #把非数字内容去掉

# 处理数字最后有9的情况,因为所有9最后都要变成0,而从后面起第一个不是9的要加1,所以暂时先用一个字符_替代9,先放在一边,这样剩下的就和情况1一样了,把这种情况处理完后,最后再把_换成0
:d
s/9\(_*\)$/_\1/
td

# 做对应的替换操作,让最后一个数字加1,第一行是防止全部数字都是9,那么就会被上面全部替换成了_,就在前面加一个1

s/^\(_*\)$/1\1/; tn
s/8\(_*\)$/9\1/; tn
s/7\(_*\)$/8\1/; tn
s/6\(_*\)$/7\1/; tn
s/5\(_*\)$/6\1/; tn
s/4\(_*\)$/5\1/; tn
s/3\(_*\)$/4\1/; tn
s/2\(_*\)$/3\1/; tn
s/1\(_*\)$/2\1/; tn
s/0\(_*\)$/1\1/; tn

# 把最开始所有的_替换成0
:n
y/_/0/

另外一个同事分享的版本,用到了sed的模式空间和保持空间的概念

#!/bin/sed -f
#如果数字全部是9,则在最前面增加个数字0
/^9*$/s/^/0/;
#将需要修改的数字用x分开,最后全是9的需要修改
s/.9*$/x&/;
#存下来
h;
#取出需要修改的部分(删除不需要修改的部分)
s/^.*x//;
#全部+1
y/0123456789/1234567890/;
#交换,将修改后的数字存入暂存空间,将之前x分割的数字取出
x;
#取出不需修改的部分
s/x.*$//;
#将修改后的部分加到不修改部分的后面
G;
#因为G会加成两行,把换行符去掉
s/\n//
 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter