花文字の上下左右反転(tacとrev)

banner花文字を反転加工してみましょう。
まずは、HELLOの花文字(*)

~$ banner HELLO | tr \# \*
*     * ******* *       *       *******
*     * *       *       *       *     *
*     * *       *       *       *     *
******* *****   *       *       *     *
*     * *       *       *       *     *
*     * *       *       *       *     *
*     * ******* ******* ******* *******

上下反転してみます。

~$ banner HELLO | tr \# \* | tac

*     * ******* ******* ******* *******
*     * *       *       *       *     *
*     * *       *       *       *     *
******* *****   *       *       *     *
*     * *       *       *       *     *
*     * *       *       *       *     *
*     * ******* *       *       *******

次に、左右反転。

~$ banner HELLO | tr \# \* | rev
*******       *       * ******* *     *
*     *       *       *       * *     *
*     *       *       *       * *     *
*     *       *       *   ***** *******
*     *       *       *       * *     *
*     *       *       *       * *     *
******* ******* ******* ******* *     *

では、HELLO以外の文字ではどうでしょうか。

~$ banner 1234 | tr \# \* | rev
*  *****   *****     *
*    * *     * *     *    **
*    * *       *          * *
*******  *****   *****     *
*      *             *    *
*      *     *       *    *
*       *****  *******  *****

あれ、左右反転していないように見えます。

実はbannerコマンドで表示される文字列は、各行で文字数が異なるため、文字数の少ない行はrevすると左に寄せられて崩れてしまうのです。
行末の位置ををつけて確認してみます。

~$ banner 1234 | sed 's/$/<CR>/'
   #     #####   #####  #<CR>
  ##    #     # #     # #    #<CR>
 # #          #       # #    #<CR>
   #     #####   #####  #######<CR>
   #    #             #      #<CR>
   #    #       #     #      #<CR>
 #####  #######  #####       #<CR>
<CR>

printfを使って各行の文字数を合わせてみます。

~$ banner 1234 | tr '\n' '\0' | xargs -0 printf "%-31s<CR>\n"
   #     #####   #####  #      <CR>
  ##    #     # #     # #    # <CR>
 # #          #       # #    # <CR>
   #     #####   #####  #######<CR>
   #    #             #      # <CR>
   #    #       #     #      # <CR>
 #####  #######  #####       # <CR>
                               <CR>
~$

ではrevしてみましょう。

~$ banner 1234 | tr '#\n' '*\0' | xargs -0 printf "%-31s\n" | rev
      *  *****   *****     *
 *    * *     * *     *    **
 *    * *       *          * *
*******  *****   *****     *
 *      *             *    *
 *      *     *       *    *
 *       *****  *******  *****

~$

綺麗に左右反転されました。
trでの改行->ヌル文字置換時に、同時に#->*置換もしています。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA