文字列操作の基本

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

はじめに

この実験では、シェルスクリプトにおける基本的な文字列操作について学びます。文字列操作は、さまざまなスクリプト作成タスクにおいて、テキストからデータを操作したり抽出したりするために不可欠です。文字列の長さを調べる、文字の位置を特定する、部分文字列を抽出する、文字列の一部を置換するといった概念を学習します。これらのスキルは、シェルスクリプトで効果的なテキスト処理を行うために極めて重要です。

クイックリファレンスガイド

この実験で扱う文字列操作の概要は以下の通りです。

操作 構文 説明
文字列の長さ ${#string} 文字列の文字数を計算します ${#"hello"}5 を返します
文字位置の検索 $(expr index "$string" "$char") 文字列内の文字の位置を検索します(1 から開始) $(expr index "abcdef" "c")3 を返します
部分文字列の抽出 ${string:start:length} 文字列の一部を抽出します(0 から開始) ${"hello":1:3}ell を返します
最初の一致を置換 ${string/pattern/replacement} 最初に一致したパターンを置換します ${"hello"/l/L}heLlo を返します
すべての一致を置換 ${string//pattern/replacement} 一致するすべてのパターンを置換します ${"hello"//l/L}heLLo を返します
先頭での置換 ${string/#pattern/replacement} 文字列の先頭にある場合のみパターンを置換します ${"hello"/#he/HE}HEllo を返します
末尾での置換 ${string/%pattern/replacement} 文字列の末尾にある場合のみパターンを置換します ${"hello"/%lo/LO}helLO を返します

スクリプトファイルの作成

まずは、文字列操作を記述するためのスクリプトファイルを作成することから始めましょう。

  1. WebIDE のターミナルを開きます。ターミナルは、Linux システムと対話するためのコマンドを入力する場所です。

  2. プロジェクトディレクトリに移動します。

    cd ~/project

    このコマンドは、現在のディレクトリを ~/project に変更します。~ 記号はホームディレクトリを表しているため、~/project はホームディレクトリ内にある「project」という名前のフォルダを指します。

  3. string_operations.sh という名前の新しいファイルを作成します。

    touch string_operations.sh

    touch コマンドは、新しく空のファイルを作成します。ファイルが既に存在する場合は、ファイルのタイムスタンプを更新します。

  4. WebIDE エディタでファイルを開きます。WebIDE の左側にあるファイルエクスプローラーでファイル名をクリックすることで開けます。

  5. ファイルの先頭に以下のシバン(shebang)行を追加して、インタプリタを指定します。

    #!/bin/bash

    「シバン」と呼ばれるこの行は、このスクリプトを解釈するために Bash シェルを使用するようにシステムに伝えます。これは常にシェルスクリプトの最初の行に記述します。

文字列の長さ

次に、文字列の長さを調べる方法を学びましょう。

  1. string_operations.sh ファイルに以下のコードを追加します。

    echo "Step 2: String Length"
    
    STRING="Hello, World!"
    LENGTH=${#STRING}
    
    echo "The string is: $STRING"
    echo "Its length is: $LENGTH"

    この内容をステップごとに解説します。

    • まず、このセクションの見出しを表示するために echo コマンドを追加します。

      echo "Step 2: String Length"
    • 次に、STRING という変数を定義し、"Hello, World!" という値を代入します。

      STRING="Hello, World!"

      Bash では、変数を定義するために特別なキーワードを使用する必要はありません。変数名を書き、続いて等号(=)、その後に値を書くだけです。

    • そして、${#variable} 構文を使用して文字列の長さを計算し、LENGTH という変数に格納します。

      LENGTH=${#STRING}

      ${#variable} は、変数に格納されている文字列の文字数を返す特別なシェルパラメータ展開です。

    • 最後に、元の文字列とその長さの両方を表示します。

      echo "The string is: $STRING"
      echo "Its length is: $LENGTH"

      変数名の前にある $ 記号は、それを変数の値に置き換えるよう Bash に指示します。

  2. ファイルを保存します。ほとんどのエディタでは、Ctrl+S(Mac の場合は Cmd+S)を押すことで保存できます。

  3. スクリプトを実行可能にします。

    chmod +x string_operations.sh

    このコマンドは、ファイルの権限を変更して実行可能にします。

    • chmod は "change mode"(モード変更)の略です。
    • +x は "add execute permission"(実行権限の追加)を意味します。
    • このステップを行わないと、システムはこのファイルがプログラムとして扱われるべきであることを認識できません。
  4. スクリプトを実行します。

    ./string_operations.sh

    ./ プレフィックスは、現在のディレクトリにあるスクリプトを探すようシェルに伝えます。これがないと、シェルは PATH 環境変数にリストされているディレクトリ内のみを検索します。

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

Step 2: String Length
The string is: Hello, World!
Its length is: 13

この出力が表示されない場合は、ファイルを保存したか、実行可能にしたかを再度確認してください。

文字位置の検索

次に、文字列内の文字の位置を見つける方法を学びます。

  1. string_operations.sh ファイルに以下のコードを追加します。

    echo -e "\nStep 3: Finding Character Position"
    
    STRING="abcdefghijklmnopqrstuvwxyz"
    CHAR="j"
    
    POSITION=$(expr index "$STRING" "$CHAR")
    
    echo "The string is: $STRING"
    echo "We're looking for the character: $CHAR"
    echo "It is at position: $POSITION"

    このコードを詳しく見ていきましょう。

    • -e オプションと \n エスケープシーケンスを含む echo コマンドから始めます。

      echo -e "\nStep 3: Finding Character Position"
      • -e オプションは、エスケープシーケンスの解釈を有効にします。
      • \n エスケープシーケンスはテキストの前に改行を追加し、前のセクションと視覚的に分離させます。
    • 次に、2 つの変数を定義します。

      STRING="abcdefghijklmnopqrstuvwxyz"
      CHAR="j"
      • STRING にはアルファベットの小文字すべてが含まれています。
      • CHAR には検索対象の文字 "j" が含まれています。
    • expr index コマンドを使用して文字の位置を検索します。

      POSITION=$(expr index "$STRING" "$CHAR")
      • expr は式を評価するためのユーティリティです。
      • index 操作は文字列内の文字を検索します。
      • $() 構文はコマンドの出力をキャプチャし、それを POSITION 変数に代入します。
      • 特殊文字による問題を避けるために、変数をダブルクォーテーション ("$STRING") で囲みます。
      • 重要: このコマンドは、1 から始まる位置を返します(0 ではありません)。
    • 最後に、結果を出力します。

      echo "The string is: $STRING"
      echo "We're looking for the character: $CHAR"
      echo "It is at position: $POSITION"
  2. ファイルを保存し、スクリプトを再度実行します。

    ./string_operations.sh

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

Step 3: Finding Character Position
The string is: abcdefghijklmnopqrstuvwxyz
We're looking for the character: j
It is at position: 10

位置が 1 から始まるインデックス(1-indexed)であることに注意してください。つまり、最初の文字は位置 0 ではなく位置 1 にあります。これは、インデックスが通常 0 から始まる多くのプログラミング言語とは異なります。

部分文字列の抽出

次に、文字列の一部を抽出する方法を学びましょう。

  1. string_operations.sh ファイルに以下のコードを追加します。

    echo -e "\nStep 4: Substring Extraction"
    
    STRING="The quick brown fox jumps over the lazy dog"
    START=10
    LENGTH=5
    
    SUBSTRING=${STRING:$START:$LENGTH}
    
    echo "The original string is: $STRING"
    echo "Extracting 5 characters starting from position 10:"
    echo "The substring is: $SUBSTRING"

    このコードを一つずつ分析します。

    • まず、視覚的に分離するために改行を入れた見出しを追加します。

      echo -e "\nStep 4: Substring Extraction"
    • 次に、変数を定義します。

      STRING="The quick brown fox jumps over the lazy dog"
      START=10
      LENGTH=5
      • STRING にはサンプルの文章が含まれています。
      • START は抽出を開始したい位置(位置 10)です。
      • LENGTH は抽出したい文字数(5 文字)です。
    • Bash の部分文字列抽出構文を使用して、文字列の一部を取得します。

      SUBSTRING=${STRING:$START:$LENGTH}
      • 構文は ${variable:start_position:length} です。
      • $START$LENGTH は、値 10 と 5 を保持する変数です。
      • 重要: expr index コマンドとは異なり、ここでの位置は 0 から始まるインデックス(0-indexed)です。つまり、最初の文字は位置 0 にあります。
    • 最後に、結果を表示します。

      echo "The original string is: $STRING"
      echo "Extracting 5 characters starting from position 10:"
      echo "The substring is: $SUBSTRING"
  2. ファイルを保存し、スクリプトを再度実行します。

    ./string_operations.sh

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

Step 4: Substring Extraction
The original string is: The quick brown fox jumps over the lazy dog
Extracting 5 characters starting from position 10:
The substring is: brown

"The quick brown fox..." という文字列において、位置 10(0 から数えた場合)は "brown" の 'b' であり、そこから 5 文字分が "brown" となります。そのため、抽出された部分文字列は "brown" になります。

前のステップで見たものとインデックスの数え方が異なることに注意してください。

  • expr index (ステップ 3) では、位置は 1 から始まります(最初の文字は位置 1)。
  • 部分文字列の抽出 ${STRING:position:length} (ステップ 4) では、位置は 0 から始まります(最初の文字は位置 0)。

これはシェルスクリプトにおいてよく混乱を招く原因となるため、どの操作がどのインデックス体系を使用するかを覚えておくことが重要です。

文字列の置換

最後に、文字列の一部を置換する方法を学びましょう。

  1. string_operations.sh ファイルに以下のコードを追加します。

    echo -e "\nStep 5: String Replacement"
    
    STRING="The quick brown fox jumps over the lazy dog"
    echo "Original string: $STRING"
    
    ## Replace the first occurrence of 'o' with 'O'
    NEW_STRING=${STRING/o/O}
    echo "Replacing first 'o' with 'O': $NEW_STRING"
    
    ## Replace all occurrences of 'o' with 'O'
    NEW_STRING=${STRING//o/O}
    echo "Replacing all 'o' with 'O': $NEW_STRING"
    
    ## Replace 'The quick' with 'The slow' if it's at the beginning of the string
    NEW_STRING=${STRING/#The quick/The slow}
    echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"
    
    ## Replace 'dog' with 'cat' if it's at the end of the string
    NEW_STRING=${STRING/%dog/cat}
    echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"

    各文字列置換操作を見ていきましょう。

    • まず、見出しを出力し、元の文字列を表示します。

      echo -e "\nStep 5: String Replacement"
      STRING="The quick brown fox jumps over the lazy dog"
      echo "Original string: $STRING"
    • 文字の最初の出現箇所を置換します。

      ## Replace the first occurrence of 'o' with 'O'
      NEW_STRING=${STRING/o/O}
      echo "Replacing first 'o' with 'O': $NEW_STRING"
      • 構文は ${variable/pattern/replacement} です。
      • これは最初に見つかった 'o' を探し、それを 'O' に置換します。
      • "brown" の中の最初の 'o' だけが置換され、他はそのまま残ります。
    • 文字のすべての出現箇所を置換します。

      ## Replace all occurrences of 'o' with 'O'
      NEW_STRING=${STRING//o/O}
      echo "Replacing all 'o' with 'O': $NEW_STRING"
      • 構文は ${variable//pattern/replacement} です(スラッシュが 2 つあることに注目してください)。
      • ダブルスラッシュは、パターンの「すべて」の出現箇所を置換するよう Bash に伝えます。
      • 文字列全体のすべての 'o' が 'O' に置換されます。
    • 文字列の先頭にあるパターンを置換します。

      ## Replace 'The quick' with 'The slow' if it's at the beginning of the string
      NEW_STRING=${STRING/#The quick/The slow}
      echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"
      • 構文は ${variable/#pattern/replacement} です。
      • # 記号は、パターンが文字列の先頭にある必要があることを指定します。
      • 'The quick' が文字列の開始位置にある場合のみ置換されます。
    • 文字列の末尾にあるパターンを置換します。

      ## Replace 'dog' with 'cat' if it's at the end of the string
      NEW_STRING=${STRING/%dog/cat}
      echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"
      • 構文は ${variable/%pattern/replacement} です。
      • % 記号は、パターンが文字列の末尾にある必要があることを指定します。
      • 'dog' が文字列の最後にある場合のみ置換されます。
  2. ファイルを保存し、スクリプトを再度実行します。

    ./string_operations.sh

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

Step 5: String Replacement
Original string: The quick brown fox jumps over the lazy dog
Replacing first 'o' with 'O': The quick brOwn fox jumps over the lazy dog
Replacing all 'o' with 'O': The quick brOwn fOx jumps Over the lazy dOg
Replacing 'The quick' with 'The slow' at the beginning: The slow brown fox jumps over the lazy dog
Replacing 'dog' with 'cat' at the end: The quick brown fox jumps over the lazy cat

これらの文字列置換操作は、シェルスクリプトでテキストを操作するための強力なツールです。パターンや位置に基づいて特定の置換を行うことができ、データ処理、テキストのフォーマット、ファイル内容の操作などのタスクに特に役立ちます。

まとめ

この実験では、シェルスクリプトにおけるいくつかの基本的な文字列操作を学び、実践しました。

  1. シェルスクリプトの作成と実行。
  2. ${#string} を使用した文字列の長さの計算。
  3. $(expr index "$string" "$char") を使用した文字列内の文字位置の検索。
  4. ${string:start:length} を使用した大きな文字列からの部分文字列の抽出。
  5. 以下の構文を使用したさまざまな文字列置換操作:
    • ${string/pattern/replacement} - 最初の出現箇所を置換
    • ${string//pattern/replacement} - すべての出現箇所を置換
    • ${string/#pattern/replacement} - 文字列の先頭で置換
    • ${string/%pattern/replacement} - 文字列の末尾で置換

これらのスキルは、シェルスクリプトにおけるより複雑なテキスト処理タスクの基礎となります。シェルスクリプトを使い続ける中で、プロジェクトにおけるテキストデータの操作や分析に、これらの文字列操作が非常に役立つことに気づくでしょう。習得の鍵は練習ですので、さまざまな文字列や操作をためらわずに試してみてください。