- 论坛徽章:
- 3
|
本帖最后由 cjaizss 于 2014-08-28 16:25 编辑
chengchow 发表于 2014-08-28 14:06 ![]()
回复 26# cjaizss
确实没看懂,慢慢看了!单独看差多懂,还是没搞懂版主思路(这个很糟糕),麻烦解释了
...
思路,先把各字段替换为1,开头无空格,结尾无空格,每两个1用单个空格隔开.
然后挨个字段+1依次替换过去.
替换完了,输出.
比如,有10个字段,先替换为
1 1 1 1 1 1 1 1 1 1
然后
1 2 1 1 1 1 1 1 1 1
1 2 3 1 1 1 1 1 1 1
1 2 3 4 1 1 1 1 1 1
1 2 3 4 5 1 1 1 1 1
1 2 3 4 5 6 1 1 1 1
1 2 3 4 5 6 7 1 1 1
1 2 3 4 5 6 7 8 1 1
1 2 3 4 5 6 7 8 9 1
1 2 3 4 5 6 7 8 9 10
输出.
- #!/bin/sed -nrf
- s/[^ \t]+/1/g
- s/[ \t]+/ /g
- s/^ | $//g
- #以上三句先把各字段替换为1,开头无空格,结尾无空格,每两个1用单个空格隔开.
- #如果本行没有字段,直接空行输出
- /^$/ {p;d;}
- #先把第一个1后面加个分号,以后每处理一个字段,往后移一下,以分号标记处理到第几个段
- s/1/1;/
- ta; #这里之所以要用t,在于清除掉之前s成功
- :a;
- #这里就是把分号往后移动一个字段,以标志处理下一个字段,并把之前处理过的值复制过去,再来做当前字段+1
- #例:
- #当前处理为
- #1 2 3; 1 1 1
- #移动之后,为
- # 1 2 3 3; 1 1
- s/([0-9]+); 1( |$)/\1 \1;\2/
- tc;
- #tc失败发生在处理完所有的字段,也就是说分号后面已经不存在1了,那么就把分号干掉,并输出
- s/;//
- p
- #这里本来应该加个d,不过我就没加了,因为此时已经没有分号,后面统统都会不成立
- #这里就是+1的技巧了,技巧其实不难,看末尾的数字,如果是0-8很简单
- #但如果是9,那么就把最后的几个9都变0,前面再+1
- #使用一个短横线作为处理的标志
- :c
- /0;/{s//1;/;ta;}
- s/;/-;/
- :b;
- s/9-/-0/
- tb
- s/0-/1/;ta;
- s/1-/2/;ta;
- s/2-/3/;ta;
- s/3-/4/;ta;
- s/4-/5/;ta;
- s/5-/6/;ta;
- s/6-/7/;ta;
- s/7-/8/;ta;
- s/8-/9/;ta;
- s/-/1/;ta;
复制代码 另外,调试sed可以用sedsed,看起来比较方便,不过我从来不用这玩意,调试都是裸调的 |
|