Linux tr コマンド:文字の変換

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linuxにおける文字単位のテキスト変換ユーティリティである tr コマンドについて学習します。「translate(変換)」の略である tr コマンドは、大文字・小文字の変換、特定の文字の削除、基本的なデータクリーニングなどのタスクに広く利用されています。この実験を終える頃には、さまざまなテキスト操作のシナリオで tr を使いこなせるようになっているはずです。初心者向けに設計されていますので、Linuxコマンドに慣れていなくても心配はいりません。各ステップを丁寧にガイドします。

tr コマンドの基本を理解する

まずは tr コマンドの基本的な構文から見ていきましょう。

tr [OPTION]... SET1 [SET2]

tr コマンドは標準入力(stdin)からテキストを読み取り、指定されたオプションと文字セットに従って変換を行い、その結果を標準出力(stdout)に書き出します。

簡単な例から始めましょう。greeting.txt というファイルを作成し、基本的な挨拶メッセージを入力した後、tr を使ってすべての小文字を大文字に変換します。

まず、ファイルを作成します。

echo "hello, world" > ~/project/greeting.txt

ヒント:ファイル作成コマンドをターミナルにコピー&ペーストすることで、正しくファイルを作成できます。

このコマンドにより、プロジェクトディレクトリ(~/project/)に "hello, world" という内容の greeting.txt が作成されます。

次に、tr を使ってすべての小文字を大文字に変換します。

cat ~/project/greeting.txt | tr 'a-z' 'A-Z'

以下のような出力が表示されるはずです。

HELLO, WORLD

コマンドの内訳は以下の通りです。

  1. cat ~/project/greeting.txt: ファイルの内容を読み取ります。
  2. |: パイプ記号です。左側のコマンドの出力を右側のコマンドの入力として渡します。
  3. tr 'a-z' 'A-Z': これが tr コマンドです。最初のセット('a-z'、すべての小文字を表す)の各文字を、対応する2番目のセット('A-Z'、すべての大文字を表す)の文字に変換します。

このコマンドは元のファイルを変更しないことに注意してください。変換後のテキストを保存したい場合は、出力を新しいファイルにリダイレクトする必要があります。

tr で文字を削除する

tr コマンドは、入力から特定の文字を削除することもできます。これは、不要な文字を取り除いてテキストを整理したい場合に非常に便利です。句読点を含むファイルを作成し、それを取り除いてみましょう。

まず、句読点を含むファイルを作成します。

echo "Hello, World! How are you?" > ~/project/punctuated.txt

ヒント:ファイル作成コマンドをターミナルにコピー&ペーストすることで、正しくファイルを作成できます。

次に、tr を使ってすべての句読点を削除します。

cat ~/project/punctuated.txt | tr -d '[:punct:]'

以下のように表示されます。

Hello World How are you

コマンドの内訳は以下の通りです。

  1. cat ~/project/punctuated.txt: ファイルの内容を読み取ります。
  2. |: 出力を tr コマンドにパイプします。
  3. tr -d '[:punct:]':
    • -d オプションは、指定した文字を削除するように tr に指示します。
    • [:punct:] は、すべての句読点文字を表す文字クラスです。文字クラスは、文字のグループを簡単に指定できるように定義された文字セットです。

このコマンドにより、テキストからすべての句読点が削除され、文字、数字、スペースのみが残ります。

複数の文字を変換する

次に、より複雑な変換を試してみましょう。エンコードされたテキストを含むファイルを作成し、tr を使ってデコードします。この例は、tr が単純な暗号化や復号化にどのように利用できるかを示しています。

まず、エンコードされたテキストを含むファイルを作成します。

echo "Uijt jt b tfdsfu nfttbhf." > ~/project/encoded.txt

ヒント:ファイル作成コマンドをターミナルにコピー&ペーストすることで、正しくファイルを作成できます。

次に、これをデコードします。

cat ~/project/encoded.txt | tr 'b-zaB-ZA' 'a-zA-Z'

以下のように表示されるはずです。

This is a secret message.

コマンドの内訳は以下の通りです。

  1. cat ~/project/encoded.txt: エンコードされたファイルの内容を読み取ります。
  2. |: 出力を tr コマンドにパイプします。
  3. tr 'b-zaB-ZA' 'a-zA-Z':
    • 最初のセット b-zaB-ZA は、2つのシフトされたアルファベットを組み合わせています。
      • b-za: 小文字の b から z、その後に a
      • B-ZA: 大文字の B から Z、その後に A
    • これらを合わせることで、1つ前の文字に戻すべきすべての文字をカバーします。
    • 2番目のセット a-zA-Z は、小文字の a から z、その後に大文字の A から Z です。
    • これにより、最初のセットの各文字が2番目のセットの対応する文字に置き換わるマッピングが作成されます。
      • b(最初のセットの1番目) → a(2番目のセットの1番目)
      • c(最初のセットの2番目) → b(2番目のセットの2番目)
      • ...
      • a(最初のセットの26番目) → z(2番目のセットの26番目)
      • B(最初のセットの27番目) → A(2番目のセットの27番目)
      • ...
      • A(最初のセットの52番目) → Z(2番目のセットの52番目)
    • これにより、入力内の各文字がアルファベット順で1つ前に戻り、メッセージが正しくデコードされます。

この種の置換は、シーザー暗号と呼ばれる非常に単純な暗号化形式です。実用的なセキュリティには向きませんが、tr を使った文字単位の置換の優れた例です。

tr で文字クラスを使用する

tr コマンドは、定義済みの文字セットであるさまざまな文字クラスをサポートしています。これらは、より複雑なテキスト変換を行う際に非常に役立ちます。実践的なシナリオでいくつか使ってみましょう。

まず、混在した内容のファイルを作成します。

echo "User123 logged in at 09:45 AM on 2023-08-15" > ~/project/log_entry.txt

ヒント:ファイル作成コマンドをターミナルにコピー&ペーストすることで、正しくファイルを作成できます。

次に、このログエントリから数字のみを抽出します。

cat ~/project/log_entry.txt | tr -cd '[:digit:]'

以下のように表示されるはずです。

12309452023815

コマンドの内訳は以下の通りです。

  1. cat ~/project/log_entry.txt: ログファイルの内容を読み取ります。
  2. |: 出力を tr コマンドにパイプします。
  3. tr -cd '[:digit:]':
    • -c オプションはセットを補完(complement)します(つまり「このセットに含まれないもの」を意味します)。
    • -d オプションは指定された文字を削除します。
    • [:digit:] はすべての数字(0-9)を表す文字クラスです。
    • 合わせて -cd '[:digit:]' は「数字以外のすべての文字を削除する」という意味になります。

このコマンドは、混在したテキストから数値データのみを抽出するのに役立ち、ログ分析やデータクリーニングのタスクで非常に便利です。

tr で繰り返しを圧縮する

tr コマンドは、繰り返される文字を1つに「圧縮(squeeze)」することもできます。これは、不要な繰り返しを含むデータを整理するのに便利です。繰り返される文字を含むファイルを作成し、それを整理してみましょう。

まず、繰り返されるスペースを含むファイルを作成します。

echo "This    is    a    test    with    extra    spaces." > ~/project/spaced.txt

ヒント:ファイル作成コマンドをターミナルにコピー&ペーストすることで、正しくファイルを作成できます。

次に、tr を使って繰り返されるスペースを圧縮します。

cat ~/project/spaced.txt | tr -s ' '

以下のように表示されるはずです。

This is a test with extra spaces.

コマンドの内訳は以下の通りです。

  1. cat ~/project/spaced.txt: 余分なスペースを含むファイルの内容を読み取ります。
  2. |: 出力を tr コマンドにパイプします。
  3. tr -s ' ':
    • -s オプションは、指定された文字の繰り返しを1つの出現に圧縮します。
    • ' ' は、スペース文字を圧縮したいことを指定しています。

このコマンドは、フォーマットが不適切なデータを扱う場合や、テキストファイルの空白を正規化する必要がある場合に特に便利です。

まとめ

この実験では、Linuxの多機能な tr コマンドについて学習しました。以下の方法を習得しました。

  1. テキストの大文字・小文字の変換
  2. 特定の文字の削除
  3. 複数の文字の変換
  4. 文字クラスの利用
  5. 繰り返される文字の圧縮

tr コマンドはテキスト操作のための強力なツールです。詳細には触れませんでしたが、他にも以下のようなオプションがあります。

  • -c: string1 に含まれないすべての文字に対して操作を行う(補完)
  • -t: string1 を string2 の長さに切り詰める

より高度なテキスト処理タスクについては、今後の実験で sedawk といった他のコマンドについても学習することをお勧めします。