fmtコマンドを文章以外で使う


アニメ『風夏』
真面目な恋愛ものですね。漫画の方を一切読んだことがないので展開楽しみです。1話目は、風夏との劇的な、いやそうでもないような出会いがあって、スターになってしまった幼馴染?が登場して、ぐらいのストーリーでしたが、それでも面白かったです。何か伝わってくるものがありました。きっと最後まで見れば感動できると思いますので視聴決定です。

私の中で最高の恋愛ストーリーといえば、「ロミオとジュリエット」です。現世で結ばれなくても魂がつながっている恋愛が素敵ですね。

さて今回はfmtコマンドを使います。
fmtを適用するテキストには、英文の「ロミオとジュリエット」を使います。ではcatしてみます。

takk@deb83:~$ cat -n romeojuliet 
     1	 JULIET
     2	O Romeo, Romeo! wherefore art thou Romeo?
     3	Deny thy father and refuse thy name;
     4	Or, if thou wilt not, be but sworn my love,
     5	And I'll no longer be a Capulet.
     6	
     7	ROMEO
     8	[Aside] Shall I hear more, or shall I speak at this?
     9	
    10	JULIET
    11	'Tis but thy name that is my enemy;
    12	Thou art thyself, though not a Montague.
    13	What's Montague? it is nor hand, nor foot,
    14	Nor arm, nor face, nor any other part
    15	Belonging to a man. O, be some other name!
    16	What's in a name? that which we call a rose
    17	By any other name would smell as sweet;
    18	So Romeo would, were he not Romeo call'd,
    19	Retain that dear perfection which he owes
    20	Without that title. Romeo, doff thy name,
    21	And for that name which is no part of thee
    22	Take all myself.
takk@deb83:~$ 

(シェークスピア「ロミオとジュリエット」より)

このテキストファイルromeojulietをfmtコマンドを使って整形してみましょう。
オプションなしの場合は、75文字以下で各行が改行されます。

takk@deb83:~$ fmt romeojuliet
 JULIET
O Romeo, Romeo! wherefore art thou Romeo?  Deny thy father and refuse
thy name; Or, if thou wilt not, be but sworn my love, And I'll no longer
be a Capulet.

ROMEO [Aside] Shall I hear more, or shall I speak at this?

JULIET 'Tis but thy name that is my enemy; Thou art thyself, though
not a Montague.  What's Montague? it is nor hand, nor foot, Nor arm,
nor face, nor any other part Belonging to a man. O, be some other name!
What's in a name? that which we call a rose By any other name would
smell as sweet; So Romeo would, were he not Romeo call'd, Retain that
dear perfection which he owes Without that title. Romeo, doff thy name,
And for that name which is no part of thee Take all myself.
takk@deb83:~$ 

元ファイルは最大行幅が52文字でしたが、fmtコマンドにより、72文字に拡張されてテキストが生成されたことになります。

takk@deb83:~$ wc -L <romeojuliet
52
takk@deb83:~$ fmt romeojuliet | wc -L
72
takk@deb83:~$ fmt -75 romeojuliet | wc -L
72
takk@deb83:~$ 

fmtコマンドに-1を指定すると、先頭の空白を除き、空白が改行に置換できます。

takk@deb83:~$ fmt -1 romeojuliet
(省略)
O
Romeo,
Romeo!
wherefore
art
thou
Romeo?
(省略)

つまりfmtコマンドは、空白と改行のコントロールができるということです。
文章以外で使ってみましょう。

takk@deb83:~$ seq 10 | fmt
1 2 3 4 5 6 7 8 9 10
takk@deb83:~$ 

本来改行されて縦に数列が並ぶseqコマンドですが、fmtの効果により空白となり横に並んでいます。

次の例です。

takk@deb83:~$ seq 100 | split -dl20
takk@deb83:~$ ls x*
x00  x01  x02  x03  x04
takk@deb83:~$ fmt -2222 x*
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 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
takk@deb83:~$ 

fmtコマンドで指定可能な文字数が2500ですので、入力しやすくて覚えやすい2222で指定しています。

仕事でよく使うテクニックとしては、メモリダンプの結果等で、あるアドレスのみ行幅を変えたい場合に以下のように使います。

takk@deb83:~$ seq 128 | perl -ne 'print chr' | od -tx1 -Ax | fmt -p000050 -w20
000000 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
000010 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20
000020 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30
000030 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40
000040 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
000050 51 52 53 54
000050 55 56 57 58
000050 59 5a 5b 5c
000050 5d 5e 5f 60
000060 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70
000070 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80
000080
takk@deb83:~$ 

コメント

タイトルとURLをコピーしました