Como usar o sed para substituir a data atual?

2

Como uso o sed para substituir a data por uma palavra. Eu tentei fazer isso:

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/"

E a saída é assim:

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           

Editar:

Eu quero que a data 27 mude para dd , como aqui:

     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           
    
por Robin 27.04.2014 / 05:42

2 respostas

3

TL; DR: Use -h ao usar cal

Por quê?

O comando cal imprime o dia atual com caracteres especiais ("realce"?). Descobri isso salvando-o em um arquivo e usando nano ( não cat ) para lê-lo:

$ cal >> out
$ nano out

Agora você verá o seguinte:

     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

Além do espanhol (desculpe) 27 não é com caracteres simples.

Agora, se você usar -h , isso será resolvido:

$ cal -h >> out2
$ nano out2

Sua saída deve ser assim para que você possa analisá-la sem problemas:

     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

Solução

No seu script, substitua cal | sed "s/$tmp/$pat/" por cal -h | sed "s/$tmp/$pat/"

Fonte: link     

por Lucio 27.04.2014 / 06:28
4

Aparentemente, você não pode analisar a saída do caldo BSD para o dia atual. Isso é porque está destacado. Se você desativar o destaque com a opção -h , funcionará:

➜  ~  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           

Para identificar a saída de cal, verifique o 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, "[7m27[27m 28 29 30           \n", 3227 28 29 30           
) = 32
write(1, "                      \n", 23                      
) = 23
exit_group(0)                           = ?
    
por Braiam 27.04.2014 / 06:25