Как использовать 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
TL; DR: использовать -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
По-видимому, Вы не можете проанализировать вывод 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) = ?