如何使用 sed 替换当前日期?

如何使用 sed 替换当前日期?

我如何使用sed单词替换日期。我尝试这样做:

tmp=`date +%d`
echo $tmp
if [ $tmp -lt 10 ]
then
        pat="d"
        echo $pat
else
        pat="dd"
        echo $pat
fi
cal | sed "s/$tmp/$pat/"

输出如下:

robin@robin-VirtualBox:~/lx$ bash p13.sh
27
dd
     April 2014       
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30           

编辑:

我希望日期27变成dd,就像这样:

     April 2014       
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
dd 28 29 30           

答案1

显然你无法解析BSD cal 的输出当前日期。这是因为它被高亮显示。如果您使用开关关闭高亮显示-h,它将起作用:

➜  ~  cal -h | sed "s/$tmp/$pat/"
     Abril 2014       
do lu ma mi ju vi sá  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
dd 28 29 30           

要识别 cal 的输出,请检查 strace:

strace cal
[...] # tons of lines here
write(1, "       1  2  3  4  5  \n", 23       1  2  3  4  5  
) = 23
write(1, " 6  7  8  9 10 11 12  \n", 23 6  7  8  9 10 11 12  
) = 23
write(1, "13 14 15 16 17 18 19  \n", 2313 14 15 16 17 18 19  
) = 23
write(1, "20 21 22 23 24 25 26  \n", 2320 21 22 23 24 25 26  
) = 23
write(1, "\33[7m27\33[27m 28 29 30           \n", 3227 28 29 30           
) = 32
write(1, "                      \n", 23                      
) = 23
exit_group(0)                           = ?

答案2

总结:-h使用时使用cal

为什么?

cal命令使用特殊字符(“突出显示”?)打印当前日期。我发现将其保存到文件中并使用nano不是 cat)阅读:

$ cal >> out
$ nano out

现在您将看到以下内容:

     Abril 2014
do lu ma mi ju vi sá
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
_^H2_^H7 28 29 30

除了西班牙语(抱歉)之外,27 没有简单的字符。

现在如果你使用-h这个就解决了:

$ cal -h >> out2
$ nano out2

您的输出应该是这样的,以便您可以毫无问题地解析它:

     Abril 2014
do lu ma mi ju vi sá
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

解决方案

在您的脚本中替换cal | sed "s/$tmp/$pat/"cal -h | sed "s/$tmp/$pat/"


来源:http://netbsd.gw.com/cgi-bin/man-cgi?cal+1+NetBSD-current

相关内容