TwitterとGistに投稿したが、せっかくなので忘れないうちにブログ記事にしておく。おとといに「符号化処理芸人衆」というタイトルで記事を書いたが、その中で@grethrenさんよりbannerコマンドについて教えてもらった。そういえばそんなコマンドあったね。
ちなみに、あのyesのやつですが、作り方があります。文字を地道に探したのではなく、作成も #シェル芸 でやりました。
— ぐれさん (@grethlen) September 22, 2016
bannerコマンドというのがあってですね。。
> @papiron pic.twitter.com/sWFpUBLVUm
ところでこのbannerコマンド、MacやFreeBSDなどのBSDなシステムに付属してるものは、なかなかカッチョエエのを出力してくれる。しかし文字が右に90度回転してて、縦に流れる。こんな感じだ。
-wオプションの後の数字は横幅の文字列長で、指定無しだとデフォルトが幅132のやたらとデカくて高精細なのが出てくる。
$ banner -w 30 Go
#####
#############
#################
### ##
# #
# #
# #
## ##
######### ####
######
####
#########
## ##
# #
# ##
## ##
#########
####
じゃあこれを90度回転させて横に並べて出力すればよかやんね?ということでシェル芸ワンライナーをやってみたよ。
まずはtrで空白と-に、#を+に変換してみる。
$ banner -w 30 'Go' | tr '# ' '+-' ---------------+++++- -----------+++++++++++++ ---------+++++++++++++++++ --------+++--------------++- --------+------------------+ -------+-------------------+ --------+------------------+ --------++---------------++ ---------+++++++++------++++ ------------++++++- -----------++++- ---------+++++++++ --------++-------++ -------+-----------+ -------+----------++ --------++-------++ ---------+++++++++ -----------++++-
次にawkで幅30文字埋まるまで、右側に-を追加する。
$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}'
---------------+++++----------
-----------+++++++++++++------
---------+++++++++++++++++----
--------+++--------------++---
--------+------------------+--
-------+-------------------+--
--------+------------------+--
--------++---------------++---
---------+++++++++------++++--
------------++++++------------
-----------++++---------------
---------+++++++++------------
--------++-------++-----------
-------+-----------+----------
-------+----------++----------
--------++-------++-----------
---------+++++++++------------
-----------++++---------------
ここからawkを使って行列入替処理を行う。FS=を使うと1文字ずつフィールド分割してくれて楽。
$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j=1;j<=NF;j++){for(i=1;i<=NR;i++){printf a[i,j]}print ""}}' FS=
------------------
------------------
------------------
------------------
------------------
------------------
------------------
-----+-------++---
---++-++----+--+--
--++---++--++--++-
--++----+--+----+-
-++-----+-++----++
-++-----++++----++
-++-----++++----++
-++-----++++----++
+++-----++-+----+-
+++-----++-+----+-
+++-----++-++--++-
+++---------+-++--
+++----------++---
-++---------------
-++---------------
-++---------------
-++---------------
--+-----+---------
--++---++---------
---+---++---------
----+++-+---------
------------------
------------------
上下逆さまなのでtail -rを使って上下逆転させる。trで元のバナーに戻して、更に行末の余計な空白をsedで削除で完成。
$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j=1;j<=NF;j++){for(i=1;i<=NR;i++){printf a[i,j]}print ""}}' FS= | tail -r | tr '+-' '# ' | sed 's/ *$//'
### #
# ##
## ##
# #
##
##
##
##
### ##
### # ##
### ## ## ##
### ## # #
### ## # #
## #### ##
## #### ##
## #### ##
## # ## ##
## # # #
## ## ## ##
## ## # #
# ##
ちなみにTukubaiのtateyokoコマンドを使うと、簡単に行列入替処理が出来るぞ。
$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | sed 's/./& /g' | tateyoko
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - + - - - - - - - + + - - -
- - - + + - + + - - - - + - - + - -
- - + + - - - + + - - + + - - + + -
- - + + - - - - + - - + - - - - + -
- + + - - - - - + - + + - - - - + +
- + + - - - - - + + + + - - - - + +
- + + - - - - - + + + + - - - - + +
- + + - - - - - + + + + - - - - + +
+ + + - - - - - + + - + - - - - + -
+ + + - - - - - + + - + - - - - + -
+ + + - - - - - + + - + + - - + + -
+ + + - - - - - - - - - + - + + - -
+ + + - - - - - - - - - - + + - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- - + - - - - - + - - - - - - - - -
- - + + - - - + + - - - - - - - - -
- - - + - - - + + - - - - - - - - -
- - - - + + + - + - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
Linuxで出来ないのか?と思ってたら@ebanさんより援護射撃が。UbuntuやDebianだとbsdmainutilsというパッケージの中にprinterbannerというコマンド名でBSDのbannerコマンドが移植されているらしい。
printbannerはbsdmainutilsパッケージ
— eban (@eban) 2016年9月24日
ということで、このネタから派生したTwitterのTLを@grethrenさんがTogetterでまとめてくれた。仕事早!
ついでにシェルスクリプトも作ったのでGistに設置。よかったらお使いあれ。UbuntuやDebianなどのLinuxでは、bsdmainutils というパッケージを入れて、シェルスクリプト12行目、banner を printerbanner に書き換えればオケ!もう一つ36行目の tail -r を tac に書き換えること。
$ coolbanner 'Hey Siri'
#### #### #####
## ## # ##
## ## # #
## ## # # ## ##
## ## # ## ##
## ## # # #
## ## #
## ## ##
######### ## ### ## ##### ###### # ###
## ## # ## ## # ##### ## ## ### ##
## ## ## ## ## # ##### ## ### ## ##
## ## # ## ## ### ## ## ## ##
## ## # # ## # ### ## ## ## ##
## ## ## # ## # ## ## ## ##
## ## ####### ## # ## ## ## ##
## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ##
## ## # ## ## ## ## ## ##
## ## ## # ## ## # ## ## ##
## ## # # ### ## ## ## ##
#### #### ## # # ### ###### ###
#
#
#
###
###