テキストを整形する

INPUT · スライド

文字を置きかえる、消す(`tr`)

01 / 06

`tr` は文字を1つずつ置きかえる

cut は列を抜く道具だったね。tr(translate = 翻訳する)は文字そのものを置きかえる道具だよ。

```
tr a-z A-Z
```

「小文字を大文字に」という意味だよ。aAbB、… と1文字ずつ対応させて置きかえるんだ。

a-z は「a から z まで」という書き方だよ。grep[a-z] と同じ考え方だね。

~ $ tr a-z A-Z < eigo.txtHELLO WORLDHELLO WORLD

02 / 06

`tr` はファイル名を受け取らない

ここが tr のいちばんの癖だよ。ファイル名を書けないんだ。

```
tr a-z A-Z eigo.txt # うまくいかない
```

tr は stdin(標準入力)しか読まない作りなので、こう書くよ。

```
tr a-z A-Z < eigo.txt # < で流し込む
cat eigo.txt | tr a-z A-Z # パイプで渡す
```

章4でやった < とパイプが、ここでどうしても必要になるんだ。あのとき「なぜ2通りあるの?」と思ったかもしれないけれど、こういう道具のためにあるんだよ。

03 / 06

`-d` で消す、`-s` で縮める

置きかえ以外に、よく使う旗が2つあるよ。

-d(delete)… 指定した文字を消す

```
tr -d 0-9 < f.txt # 数字を全部消す
```

-s(squeeze)… 同じ文字が並んでいたら1つに縮める

```
tr -s ' ' < f.txt # 空白の連なりを1つに
```

-s は前のレッスンで困った「空白の幅がそろっていない」データを直せるよ。空白を1つに揃えてしまえば、cut -d" " が使えるようになるんだ。

04 / 06

`-s` で空行を消す

-s の便利な使い方をもう1つ。改行を縮めると、空行が消えるんだ。

```
tr -s '\n' < kara.txt
```

空行というのは「改行が2つ続いている」ということだよね。だから改行の連なりを1つに縮めれば、空行が無くなるんだ。

\n は改行を表す書き方だよ。シェルに勘違いされないよう、シングルクォートで囲むのを忘れないでね。

05 / 06

大文字と小文字は別の文字

気をつけてほしいことがあるよ。tr大文字と小文字を別のものとして扱うんだ。

```
~ $ tr -d aeiou < eigo.txt
hll wrld
HELLO Wrld
```

1行目の hello world からは母音が消えたのに、2行目の HELLO はそのまま残っているね。aeiou と書いたので、大文字の AEIOU は対象外なんだ。

両方消したいなら tr -d aeiouAEIOU と書くよ。

grep -i のような「大小を無視する」旗は tr には無いんだ。要る文字を全部書くのが tr の作法だよ。

06 / 06

さあ、打ってみよう

ファイルは4つだよ。

  • eigo.txthello worldHELLO World
  • csv.txta,b,cd,e,f
  • sukima.txtone two three(空白の数がバラバラ)
  • kara.txtaaa bbb・空行・空行・ccc

毎回 < かパイプが要るのを忘れないでね。tr にファイル名を書いても読んでくれないよ。打ち間違えたときの反応も1回見ておくと、忘れなくなるよ。