web-dev-qa-db-fra.com

Comment utiliser sed pour remplacer la date actuelle?

Comment utiliser sed pour remplacer la date par un Word. J'ai essayé de faire ça:

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

Et la sortie est comme ça:

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           

Modifier:

Je veux la date 27 pour changer en dd, comme ici:

     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           
2
Robin

TL; DR: Utilisez -h lors de l'utilisation de cal

Pourquoi?

La commande cal imprime le jour en cours avec des caractères spéciaux ("surbrillance"?). J'ai découvert cela en l'enregistrant dans un fichier et en utilisant nano ( pascat) pour le lire:

$ cal >> out
$ nano out

Vous verrez maintenant ce qui suit:

     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

À côté de l'espagnol (désolé), 27 n'est pas avec des caractères simples.

Maintenant, si vous utilisez -h ceci est résolu:

$ cal -h >> out2
$ nano out2

Votre sortie doit être comme ceci afin que vous puissiez l'analyser sans problème:

     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

Solution

Dans votre script, remplacez cal | sed "s/$tmp/$pat/" avec cal -h | sed "s/$tmp/$pat/"


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

3
Lucio

Apparemment, vous ne pouvez pas analyser la sortie de cal BSD pour le jour en cours. C'est parce qu'il est mis en évidence. Si vous désactivez la mise en surbrillance avec le -h switch, cela fonctionnera:

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

Pour identifier la sortie de cal, vérifiez la 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)                           = ?
4
Braiam