UNIX SHELL脚本用Sed替换文本,我有程序工作,但对于一个简单的特殊情况,它不起作用,我该如何纠正它?

时间:2013-12-17 15:54:35

标签: shell unix sed

问题陈述是

如果今天的日期是个位数,那么用单个*替换该日期 如果今天的日期是两位数,则将其替换为double *

我的代码适用于单个数字日期。

但我的sed代码无法用双**替换双位数。

这是我的代码:

#!/bin/sh
set `date`
if [ $3 -le 9 ]
then
       n=`cal | tail -n +3 | grep -n "$3"| cut -d ":" -f1 | head -n 1`
       n=`expr $n + 2`
       cal | sed "$n s/$3/*/"
else
       cal | sed "s/$3/**/"
fi

这行中的错误是什么

cal | sed "s/$3/**/"

假设$3包含值19

这是cal |的输出cat -vte

abhijith@abhijith-compaq-420:~/Desktop$ cal | cat -vte
   December 2013      $
Su Mo Tu We Th Fr Sa  $
 1  2  3  4  5  6  7  $
 8  9 10 _^H1_^H1 12 13 14  $
15 16 17 18 19 20 21  $
22 23 24 25 26 27 28  $
29 30 31              $
                      $

1 个答案:

答案 0 :(得分:2)

cal | sed "s/$3/**/"对我来说很好。但我建议用这种方式重写你的脚本:

#!/bin/sh
day=`date +%d`
case $day in
?) cal | sed "s/ $day/ */" ;;
??) cal | sed "s/$day/**/" ;;
esac

<强>更新

既然你说它不适合你,让我们回到基础。这个脚本的输出是什么:

#!/bin/sh
day=9; cal | sed "s/ $day/ */"
day=19; cal | sed "s/$day/**/"

我明白了:

   December 2013
 S  M Tu  W Th  F  S
 1  2  3  4  5  6  7
 8  * 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
   December 2013
 S  M Tu  W Th  F  S
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 ** 20 21
22 23 24 25 26 27 28
29 30 31