2008年07月18日

问题:
把每行的第二个字符到第六个字符替换成星号
原文
123456
1234567
12345

要求结果

1*****
1*****7
1****

解法:
1.

BASH:
  1. '/^../{h;s/^.\(.\{1,5\}\).*/\1/;s/./*/g;G;s/\(.*\)\n\(.\).\{1,5\}\(.*\)/\2\1\3/}'

2.

BASH:
  1. -r '/.{6}/bb
  2. :a
  3. s/(.\**)[^*]/\1\*/
  4. ta
  5. b
  6. :b
  7. /^.\*{5}/! {
  8. s/(.\**)[^*]/\1\*/
  9. tb
  10. }'

3.

BASH:
  1. awk '{a=(substr($0,2,5));gsub(/./,"*",a);print substr($0,1,1)a""substr($0,7,length($0))}'

4.

BASH:
  1. 's/^\(.\)\(.\{1,5\}\)\(.*\)/\1\n\2\n\3/' file  | '{n; s/./*/g;n}' | '{N; N; s/\n//g}'

5.

BASH:
  1. ':a;/^.[*]\{5\}/!{s/\(.[*]*\)./\1*/;/*$/!ta}'

问题:
比较2008-01-29和2008-02-1之间相差月份

解法:
1.

BASH:
  1. echo "$date1-$date2" | awk -F'-' '{a=($1-$4)*12+($2-$5);print sqrt(a*a)}'

标签 :

4 楼了已经

  • luguo写于08年07月18日

    第1个的perl解法:
    perl -ne 'chomp; $i= length($_) > 6? 5: length($_)-2; substr($_, 1, $i)="*"x$i; print "$_\n";' test.txt

  • luguo写于08年07月18日

    Oops! 应该是:perl -ne 'chomp; $i= length($_) > 6? 5: length($_)-1; substr($_, 1, $i)="*"x$i; print "$_\n";' test.txt

  • luguo写于08年07月18日

    或者更简单的:
    perl -ne '$i= length($_) > 7? 5: length($_)-2; substr($_, 1, $i)="*"x$i; print;' test.txt

  • luguo写于08年07月18日

    第2个:
    echo '2008-01-2007-12' | perl -ne '($a, $b, $c, $d)=split/\-/; print abs(($a-$c)*12+$b-$d), "\n";'

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« shell脚本解题3
» shell脚本解题5