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

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

はじめに

この実験では、文字レベルでテキストを変換するための多機能なユーティリティである Linux の tr コマンドについて学習します。tr コマンドは「translate(変換)」の略で、大文字小文字の変換、特定の文字の削除、基本的なデータのクリーニングなどのタスクに広く使用されています。この実験を終える頃には、さまざまなテキスト操作のシナリオで 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 コマンド本体です。第 1 セット('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 オプションは、指定された文字を削除(delete)するよう tr に指示します。
    • [:punct:] は、すべての句読点文字を表す文字クラスです。文字クラスは、文字のグループを簡単に指定できるようにあらかじめ定義されたセットです。

このコマンドはテキストからすべての句読点を取り除き、文字、数字、スペースだけを残します。

複数の文字の置換

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

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

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

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

では、これをデコードしてみましょう。

cat ~/project/encoded.txt | tr 'b-za-a' 'a-z'

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

This is a secret message.

このコマンドを分解して説明します。

  1. cat ~/project/encoded.txt: エンコードされたファイルの内容を読み取ります。
  2. |: 出力を tr コマンドにパイプで渡します。
  3. tr 'b-za-a' 'a-z':
    • 第 1 セット 'b-za-a' の構成:
      • 'b-z': b から z までの文字
      • 'a-a': 文字 a
      • つまり、第 1 セット全体は b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a となります。
    • 第 2 セット 'a-z' は a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z です。
    • これにより、第 1 セットの各文字が第 2 セットの対応する文字に置き換わるマッピングが作成されます。
      • b (第 1 セットの 1 番目) → a (第 2 セットの 1 番目)
      • c (第 1 セットの 2 番目) → b (第 2 セットの 2 番目)
      • ...
      • a (第 1 セットの 26 番目) → z (第 2 セットの 26 番目)
    • これにより、入力された各文字がアルファベット順で 1 つ前の文字にシフトされます(シーザー暗号の復号)。
    • 注意: tr コマンドは文字ごとの置換を行うため、この例では小文字のみが影響を受けます。メッセージの冒頭にある "T" のような大文字は、第 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 オプションはセットの補集合(「このセットに含まれないもの」)を対象にします。
    • -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 つの文字に集約(squeeze)します。
    • ' ' は、スペース文字を集約の対象に指定しています。

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

まとめ

この実験では、Linux の多機能な tr コマンドについて学習しました。学んだ内容は以下の通りです。

  1. テキストの大文字小文字の変換
  2. 特定の文字の削除
  3. 複数の文字の置換
  4. 文字クラスの利用
  5. 連続する文字の集約(スクイーズ)

tr コマンドはテキスト操作のための強力なツールです。今回詳しく説明しなかった追加のオプションには以下のようなものがあります。

  • -c: 第 1 引数で指定した文字セットの補集合(セットに含まれないすべての文字)を対象にする
  • -t: 第 1 引数の文字列を第 2 引数の文字列の長さに切り詰める

より高度なテキスト処理タスクについては、今後の実験で sedawk といった他のコマンドも探索してみるとよいでしょう。