Если вы посмотрите на вывод cal
с помощью od
, вы увидите, что есть пробелы, которые вы должны удалить с помощью _
перед сегодняшней датой:
$ echo $(cal) | od -a
0000000 S e p t e m b e r sp 2 0 1 8 sp S
0000020 u sp M o sp T u sp W e sp T h sp F r
0000040 sp S a sp _ bs sp _ bs 1 sp 2 sp 3 sp 4
0000060 sp 5 sp 6 sp 7 sp 8 sp 9 sp 1 0 sp 1 1
0000100 sp 1 2 sp 1 3 sp 1 4 sp 1 5 sp 1 6 sp
0000120 1 7 sp 1 8 sp 1 9 sp 2 0 sp 2 1 sp 2
0000140 2 sp 2 3 sp 2 4 sp 2 5 sp 2 6 sp 2 7
0000160 sp 2 8 sp 2 9 sp 3 0 nl
Сегодня это 1
, и вы можете увидеть последовательность _ bs sp _ bs 1
в выводе выше.
Чтобы заменить сегодняшнюю дату на ★
, это легко сделать с помощью awk
, заменив эти 5 символов и номер даты:
$ echo $(cal) | awk -v t=$(echo $(date +%e)) 'sub("_[\b] _[\b]"t,"★")'
September 2018 Su Mo Tu We Th Fr Sa ★ 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 -h
, который отключит подсветку сегодняшней даты, а затем просто выполните:
$ echo $(cal -h) | awk -v t=$(echo $(date +%e)) 'sub(" " t " "," ★ ")'
September 2018 Su Mo Tu We Th Fr Sa ★ 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
Или с sed
также в этом случае:
$ echo $(cal -h) | sed -E "s/ $(echo $(date +%e)) / ★ /"
September 2018 Su Mo Tu We Th Fr Sa ★ 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
sed
не так легко использовать, как awk
в первом случае, поскольку в нем отсутствует постоянная поддержка экранированных символов, таких как \b
(кроме GNU sed).