怎样用sed把每行的第二个字符到第六个字符替换成星号?

5961阅读 0评论2010-07-25 greendays
分类:

求助:怎样用sed把每行的第二个字符到第六个字符替换成星号?
原文
  1. 123456
  2. 1234567
  3. 12345
复制代码


要求结果
  1. 1*****
  2. 1*****7
  3. 1****
复制代码


请问怎样用sed实现?
请注意不足6位的行的处理。

========================================解决方案分割线========================================

感谢各位朋友的热心帮助,以下是我在HP-UX上测试过的解决方案的不完全统计:
  1. sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile
复制代码
  1. sed '/^../{h;s/^.\(.\{1,5\}\).*/\1/;s/./*/g;G;s/\(.*\)\n\(.\).\{1,5\}\(.*\)/\2\1\3/;}' urfile
复制代码

  1. sed '
  2. :a
  3. /^.[*]\{5\}/!{
  4. s/\(.[*]*\)./\1*/
  5. /*$/!ta
  6. }' urfile
复制代码


也有朋友顺便给出了awk的方案,测试过两个:
  1. awk '{a=(substr($0,2,5));gsub(/./,"*",a);print substr($0,1,1)a""substr($0,7,length($0))}' urfile
复制代码
  1. awk '{for(i=1;i<=length($0);i++) if(i>1&&i<6) printf "*";else printf substr($0,i,1);print ""}' urfile
复制代码


再次感谢各位!

[ 本帖最后由 Shell_HAT 于 2008-7-23 14:42 编辑 ]
__________________________________


|  |  | 

简单但不好看的方法:sed 's/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/'
__________________________________
开源资源:
软件下载
开源镜像
手册中心
欢迎大家访问,并提出建议和意见。


|  |  | 

回复 #2 walkerxk 的帖子

$ sed 's/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/;s/[^*]/*/' urfile
******
******7
*****

第一个字符不允许替换
__________________________________


|  |  | 

Shell处理起来似乎有难度,Perl处理这个容易些,

Shell我不知道有什么办法可以保留第一个字
__________________________________









|  |  | 

回复 #1 Shell_HAT 的帖子

try:
  1. $ sed '/^../{h;s/^.\(.\{2,5\}\).*/\1/;s/./*/g;G;s/\(.*\)\n\(.\).\{2,5\}\(.*\)/\2\1\3/}' urfile
复制代码


改正:
  1. $ head urfile
  2. 123456
  3. 1234567
  4. 12345
  5. 12
  6. 123456789
  7. 1
  8. $ sed '/^../{h;s/^.\(.\{1,5\}\).*/\1/;s/./*/g;G;s/\(.*\)\n\(.\).\{1,5\}/\2\1/}' urfile
  9. 1*****
  10. 1*****7
  11. 1****
  12. 1*
  13. 1*****789
  14. 1
复制代码

[ 本帖最后由 blackold 于 2008-7-17 15:13 编辑 ]
__________________________________

LIVE FREE OR DIE!     K.I.S.S.  DRY



远离                                                                                                                                                                       shell


|  |  | 

把{1}{5}{6}数字改一下就可扩展
  1. sed -r '/.{6}/bb
  2. :a
  3. s/(.\**)[^*]/\1\*/
  4. ta
  5. b
  6. :b
  7. /^.{1}\*{5}/! {
  8. s/(.\**)[^*]/\1\*/
  9. tb
  10. }'
复制代码

以下为测试:
  1. { echo '123';echo '1234';echo '1234567';echo '12345678';echo '1*34';echo '1*3*5678';} | sed -r '/.{6}/bb
  2. :a
  3. s/(.\**)[^*]/\1\*/
  4. ta
  5. b
  6. :b
  7. /^.\*{1}{5}/! {
  8. s/(.\**)[^*]/\1\*/
  9. tb
  10. }';
  11. 1**
  12. 1***
  13. 1*****7
  14. 1*****78
  15. 1***
  16. 1*****78
复制代码

[ 本帖最后由 cjaizss 于 2008-7-17 15:52 编辑 ]
__________________________________
驿马动,火迫金行,大利西方


|  |  | 


回复 #1 Shell_HAT 的帖子

还得用sed啊。
上一篇:shell编程中循环语句问题
下一篇:字符串截取