=========================================================== || COMMA NDCOMMA N D C O M M A NDCOMM || ||A N D C OM MA ND CO M M AN D C O|| ||M M A N D C O M M A N D C O M M A N|| ||D C O M M A N D C O M M A N D C|| ||O M M A N D C OMMANDC O M M A N|| ||D C O M M A N D C O M MA N D|| || COMMA NDCOMMA N D C O M M A N DCOMMA || || || ===========================================================
bannerコマンドで出力される#の部分を”COMMAND”という文字列に置き換えて枠をつけました。
この文字列の置き換えですが、素直に考えると以下のようなコマンドラインになると思います(実はこんなに書かなくて良いのですが)。
~$ banner COMMAND | perl -pe ' > BEGIN{@a=split//,"COMMAND"; > sub a{push@a,$a[0];return shift @a}} > s/#/a/ge; > '
BEGINブロックは、awkにもありますので、awkを例にして説明します。
awkはテキスト整形するための使い方が本来なので、行単位でスクリプトを書きます。以下のようにbanner ABCの四方を囲いたい場合は、BEGIN{}とEND{}ブロック、さらに{}が大活躍します。
~$ banner ABC | awk ' > BEGIN{print "+-------------------------+"} > {printf "| %-23s |\n",$0} > END{print "+-------------------------+"} > ' +-------------------------+ | # ###### ##### | | # # # # # # | | # # # # # | | # # ###### # | | ####### # # # | | # # # # # # | | # # ###### ##### | | | +-------------------------+ ~$
行単位のスクリプトを書くスタイルは、読む時も分かりやすく、行頭を見るだけで条件が分かるようになります。
以下は、4行目までは#を.へ置換して、全行に渡りprintfで表示しています。
~$ banner ABC | awk ' BEGIN{print "++=======================++"} NR<=4{gsub("#",".")} {printf "||%-23s||\n",$0} END{print "++=======================++"} ' ++=======================++ || . ...... ..... || || . . . . . .|| || . . . . . || ||. . ...... . || ||####### # # # || ||# # # # # #|| ||# # ###### ##### || || || ++=======================++ ~$
perlのスクリプトの説明に戻ります。
BEGIN{}については、awkと同様、最初の一回のみ実行されます。
> BEGIN{@a=split//,”COMMAND”;
> sub a{push@a,$a[0];return shift @a}}
文字を入れ替え易くするため、split関数により”COMMAND”という文字列を配列にしています。
shiftを使うと、配列の先頭から要素を取り出し、pushを使うと、配列の最後に要素を追加します。
両方を使うことで、配列がCOMMAND→OMMANDC→OMMANDCO→MMANDCOM…というように一文字ずつローテートするわけです。
> s/#/a/ge;
で、最後に毎行#をa関数の結果で置換します。
基本的な考え方が分かったところで、もう少し簡単なスクリプトにしてみましょう。
perlのスクリプト部分は、これだけで済みます。
‘BEGIN{@a=split//,”COMMAND”x99}s/#/shift @a/ge’
“COMMAND”をローテートするなら、push/shiftがセットで必要となりましたが、bannerで表示されるコマンドの#の数が限られていますので、置換したい数分だけ”COMMAND”の文字列を用意しておけば、つまりshiftのみ使えば良いのです。
perlでは繰り替えし文字列を生成するのに 文字列x数 を使います。
例では”COMMAND”x99としていますが、#は以下のように138個しか出現しませんので、20個(138/7文字)で十分ですが、
~$ banner COMMAND | tr -d ' \n' | wc -L 138 ~$
入力のしやすい99を使っています(もしくは999)。
では実行してみましょう。
~$ banner COMMAND | perl -pe ' > BEGIN{@a=split//,"COMMAND"x99}s/#/shift @a/ge' COMMA NDCOMMA N D C O M M A NDCOMM A N D C OM MA ND CO M M AN D C O M M A N D C O M M A N D C O M M A N D C O M M A N D C O M M A N D C O M M A N D C OMMANDC O M M A N D C O M M A N D C O M MA N D COMMA NDCOMMA N D C O M M A N DCOMMA ~$
コメント
[…] 今回は、上の画像のように、bannerを仮装させたいと思います。 bannerコマンドを使った遊びとしては、過去に「text in sysvbanner(バナーコマンド遊び)」「cutで暗号解読?rubyのzipを使った文字列合成」「花文字バナーをHTMLへ」でも取り上げましたが、まだまだbannerで遊べそうです。 では、まず普通にbannerコマンドを使ってみます。 […]