web-dev-qa-db-ja.com

sedを使用して現在の日付を置き換える方法は?

sedを使用して、Wordで日付を置換するにはどうすればよいですか。私はこれを試しました:

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

TL; DR:calを使用する場合は-hを使用

なぜ?

calコマンドは、現在の日付を特殊文字(「強調表示」?)で表示します。これをファイルに保存し、nanonotcat)を使用してそれを読み取ることがわかりました:

$ 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

3
Lucio

どうやら、今日の 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)                           = ?
4
Braiam