昨日のシェル芸ヴェンキョウカイ(問2)で話題になった、BSD系環境で制御コードを置換するはなしです。
sedではやれないけどtrなら……という話です。

### 内容
#### 概要 問2の模範解答は ```sh comm <(sort a) <(sort b) | sed 's/^/\t/' | sed 's/\t\t\t/c /' | sed 's/\t\t/b /' | sed 's/\t/a /' | sort
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
これは「先頭にtabを突っ込んで、タブの連続を置換していく」という解き方で、GNU sedの利用を前提としています。今回は解説のため、まずはBSDのsedとtrを使った別解を書いてみます。<br/>
tabの代わりにカンマ(,)を使用するという発想です。
```sh
% comm &lt;(sort a) &lt;(sort b) | tr &#39;\011&#39; &#39;,&#39; |  sed &#39;s/^/,/&#39; | sed &#39;s/,,,/c /&#39; | sed &#39;s/,,/b /&#39; | sed &#39;s/,/a /&#39; | sort
a 川崎
a 鹿島田
b 南多摩
b 登戸
c 分倍河原
c 谷保

#### trの部分の解説 trの前で止めるとこうなっていて ```sh % comm <(sort a) <(sort b) 分倍河原 南多摩 川崎 登戸 谷保 鹿島田
 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
```sh
% comm &lt;(sort a) &lt;(sort b) | tr &#39;\011&#39; &#39;,&#39;
,,分倍河原
,南多摩
川崎
,登戸
,,谷保
鹿島田

``` <br/>
さて、manによると

    >
        \octal
バックスラッシュに続き、1〜3 桁の 8 進数が続いたものは、その値 を符号化した文字を表現します。この 8 進数の並びに続いて数字を 文字として指定したい場合には、8 進数の並びが 3 桁となるよう に、8 進数の上位桁 (左) に 0 を埋めてください

    
とのことです。つまり
```sh
tr &#39;\011&#39; &#39;,&#39;

```は、ASCIIコードでtab(16進数で09、8進数で11)をカンマ(,)に置換する、ということになります。 <br/>
 <br/>
 <br/>
 

</div>
<div class="section">
    #### どんでん返しその1
    さっきの、sedのmanの続きです……

    >
        \character
バックスラッシュに続く、特定の特殊な文字は、特殊な値に対応しています。\a &lt;ベル文字>
\b &lt;バックスペース>
\f &lt;フォームフィード>
\n &lt;改行>
\r &lt;復帰>
\t &lt;水平タブ>
\v &lt;垂直タブ>

    
trは普通にバックスラッシュ文字が使えました……そういえばそうだった……<br/>
つまり
```sh
% comm &lt;(sort a) &lt;(sort b) | tr &#39;\t&#39; &#39;,&#39; | sed &#39;s/^/,/&#39; | sed &#39;s/,,,/c /&#39; | sed &#39;s/,,/b /&#39; | sed &#39;s/,/a /&#39; | sort

```でいいってことですよ奥さん!! <br/>
<br/>


</div>
<div class="section">
    #### どんでん返しその2
    ……ここまで書いといて何ですが、printf使えばsedでもやれます[FreeBSDのsedで\rを取り除く方法 - Qiita](http://qiita.com/kunst1080/items/f5e53885fe3de5546e7e)<br/>

```sh
comm &lt;(sort a) &lt;(sort b) | sed "s/^/`printf &#39;\t&#39;`/" | sed "s/`printf &#39;\t\t\t&#39;`/c /" | sed "s/`printf &#39;\t\t&#39;`/b /" | sed "s/`printf &#39;\t&#39;`/a /" | sort

``` <br/>
以上!<br/>
<br/>
<br/>


</div>
</div>
<div class="section">
    ### 参考URL
    
<ul>
<li><a href="http://kaworu.jpn.org/doc/FreeBSD/jman/man1/tr.1.php">tr(1) FreeBSDドキュメントJMan</a></li>
</ul>
</div>