我如何使用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