文字列を Bash の変数に分割する

Abdul Mateen 2023年6月20日
  1. Bash の文字列
  2. Bash の文字列関数
  3. 文字列を Bash の変数に分割する
  4. cut コマンドを使用して、Bash で文字列を変数に分割する
  5. Bash で内部フィールド区切り記号 (IFS) を使用して文字列を変数に分割する
  6. sedread を使用して、Bash で文字列を変数に分割する
  7. Bash で正規表現を使用して文字列を変数に分割する
文字列を Bash の変数に分割する

このチュートリアルでは、Bash で文字列を変数に分割するさまざまな方法について説明します。

文字列の簡単な紹介から議論を始めます。 後で、Bash の例を使用して文字列を分割するさまざまな方法について説明します。

Bash の文字列

文字列は、文字の組み合わせ/コレクションです。 Bash では、文字列は整数や浮動小数点数のようなデータ型です。

文字列内の数字は ASCII 文字のシーケンスとして表示されるため、文字には数字も含まれる場合があります。

整数や浮動小数点数などのデータ型では、数値は完全なエンティティです。 数字の個々の存在はありません。 ただし、文字列では、文字列内のすべての文字 (スペース、コンマ、セミコロン、およびコロンを含む) にそれぞれの表現があります。

組み合わせて、個々の文字も完全な文字列を表します。 キーボードから入力できる任意の文字を文字列の一部にすることができます。

例えば:

s1="Welcome"
s2="This is a complete sentence and string as well"
s3="The string, has some special charactrs like ,$%^[]"
s4="The population of country ABC is 12345678"

ここでは、最初の文字列にはアルファベットのみが含まれています。 次の文字列 (つまり、s2) にもスペースが含まれています。 これらのスペースは文字列の一部であり、アルファベットのように格納されます。

したがって、2 番目の文字列には 8つのスペースがあり、メモリ内で 8 バイトを使用します。

Third-string には特殊文字があり、これも文字列の一部です。

最後に、4 番目の文字列には数字ではなく数字の組み合わせがあります。 数値として計算・比較したい場合は、なんらかの仕組みで数値に変換しないと無理です。

Bash の文字列関数

整数または浮動小数点数の算術演算と同様に、特定の演算/関数が文字列で可能/利用可能です。

たとえば、2つの文字列が等しいかどうかを比較できます (文字列または部分文字列を見つける必要がある場合は、等価演算が必要です)。 Bash スクリプトは次のとおりです。

s1="World Cup."
s2="World Cup"

if [ "$s1" = "$s2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

s3="World Cup."

if [ "$s1" = "$s3" ];  then
    echo "Both the strings are equal."
else
    echo "Strings are not equal."
fi

ここでは、同じように見える 2つの文字列があります。 ただし、最初の文字列の末尾のドットに違いがあります。

上記のスクリプトは、最初に if ステートメントを使用して 2つの文字列を比較します。ここで、文字列変数は二重引用符で囲み、単一の等号を使用して比較します。

次に、最初の文字列と同じように別の文字列 s3 を宣言し、再度比較を実行します。 このスクリプトの出力は次のとおりです。

Strings are not equal.
Both the strings are equal.

ハッシュ記号を使用して文字列の長さを見つけることができます。 Bash スクリプトは次のとおりです。

s=abcAXYZ123456_AaBbCc
echo "Length of " $s " is:" ${#s}

このスクリプトの出力は次のとおりです。

Length of abcAXYZ123456_AaBbCc is: 20

正規表現を使用して部分文字列の長さを比較して取得できます (正規表現の詳細については説明しません。正規表現はこちら についてお読みください)。

正規表現を使用したマッチングのコードは次のとおりです。

s=abcAXYZ123456_AaBbCc
echo `expr match "$s" 'abc[A-Z]*.2'`
echo `expr "$s" : 'abc[A-Z]*.[0-9]*_'`

最初の一致では、小文字の abc に続いて大文字のアルファベット (0 個以上)、数字の 2 が続きます。

2 番目の一致は、少し異なる方法を使用します。 それにもかかわらず、正規表現を使用してアンダースコアで閉じられた部分文字列を照合します。

上記のスクリプトの出力は次のとおりです。

9
14

最初の一致では、数字 2 は位置 9 にあり、2 番目の一致では、アンダースコアは位置 14 にあります。文字列で可能な操作/関数の長いリストがあります。

最初の一致では、数字 2 は 9 番目の位置にあります。2 番目の一致では、アンダースコアは 14 番目の位置にあります。

ただし、文字列を分割するというメイン トピックに進みます。

文字列を Bash の変数に分割する

文字列を文字または部分文字列に分割することは、一般的で頻繁に使用される操作です。 たとえば、式を評価する前に、式を変数と演算子 (トークンと呼ばれる) に分割する必要があります。

翻訳フェーズを開始する前に、コンパイラまたは他の言語翻訳者は字句解析器を使用して、プログラム、文字列を分析し、変数、キーワード、ブロック、関数などに分割します。自然言語処理では、記事を文、単語、 動詞、名詞などが必要です。

Bash で文字列を分割する方法はいくつかあります。 例を挙げて説明します。

cut コマンドを使用して、Bash で文字列を変数に分割する

Bash では、cut 操作を使用して文字列を分割できます。 cut コマンドの構文は次のとおりです。

cut -f(number) -d(delimiter)

cut コマンドは、-d オプションの後に指定された区切り文字に基づいて文字列を分割します。 文字列の区切り文字は、2つの部分文字列を区切る (または区切ると見なされる) 任意の文字にすることができます。

たとえば、英語では、文はドットで区切られます。 したがって、ドットは、文を区切るための区切り文字と見なすことができます。 同様に、スペースは単語を区切る区切り文字です。

演算子は、算術式 (プログラミング) のオペランド間の区切り文字です。

次に、区切り文字としてハイフンを含む文字列を持つスクリプトがあります。 文字列は 3つの変数に分割されます。

初めて変数を使用する場合、ドル記号は必要ありません。 ただし、後続の操作では、変数にドル記号が必要です。 スクリプトは次のとおりです。

v="0123-456-789"
v1=$(echo $v | cut -f1 -d-)
v2=$(echo $v | cut -f2 -d-)
v3=$(echo $v | cut -f3 -d-)
echo $v1
echo $v2
echo $v3

このスクリプトの出力は次のとおりです。

0123
456
789

アイデアを提供するために、cut 操作で別の区切り文字を使用します。 区切り文字としてコロンを使用した別のスクリプトを次に示します。

v="0123:456:789"
v1=$(echo $v | cut -f1 -d:)
v2=$(echo $v | cut -f2 -d:)
v3=$(echo $v | cut -f3 -d:)
echo $v1
echo $v2
echo $v3

コードは区切り文字を除いて同じです。 コロンは文字列の区切り文字です。 cut 操作でも同じことが使用されます。

このスクリプトの出力は次のとおりです。

0123
456
789

cut 操作には、単一の区切り文字のオプションがあります。 ただし、内部フィールド区切り記号を使用すると、複数の区切り記号を使用できます。

Bash で内部フィールド区切り記号 (IFS) を使用して文字列を変数に分割する

IFS を使用すると、単一または複数の区切り文字を使用できます。 単一の区切り文字の場合、引用符は必要ありません。 ただし、さまざまな区切り文字を使用するために、二重引用符に複数の区切り文字を含めることができます。

非常に基本的な例を見てみましょう。

IFS=- read v1 v2 v3 v4 <<< this-is-batch-file
echo $v1
echo $v2
echo $v3
echo $v4

上記のスクリプトでは、IFS の区切り文字は 1つだけです。 IFS を使用して、文字列 this-is-batch-file を変数 v1 から v4 に割り当てることを読み取ります。

このスクリプトの出力は次のとおりです。

this
is
batch
file

次に、複数の区切り文字の例を示します。 次のスクリプトを参照してください。

IFS=" ,: " read v1 v2 v3 v4 <<< is,something,strange:there
echo $v1
echo $v2
echo $v3
echo $v4

ここでは、IFS で 2つの区切り記号が使用されており、string にも 2つの区切り記号が含まれています。 最初の 3つの単語はカンマで区切り、最後の単語はコロンで区切ります。

出力は次のとおりです。

is
something
strange
there

IFS を使用するようになったので、複数の区切り文字を使用できるようになりました。

文字列を分割するために常に区切り文字を指定する必要がありますか? 答えはいいえだ; 他の方法もあります。

sedread を使用して、Bash で文字列を変数に分割する

readsed (行ごとに多くの文字列操作を実行できる特別なコマンド) を使用して、文字列を文字の配列に分割できます。 したがって、文字の配列を取得したら、特定の要件に従ってそれらを操作できます。

スクリプトは次のとおりです。

read -ra var5 <<<"$(echo "12-34-56" | sed 's/./& /g')"
echo ${var5[0]}
echo ${var5[1]}
echo ${var5[2]}
echo ${var5[3]}

このスクリプトの出力は次のとおりです。

1
2
-
3

ハイフン文字も文字として配置されることに注意してください。 したがって、このメソッドは区切り文字で文字列を分割できません。 代わりに、文字列を文字の配列に分割します。

この方法には例外が 1つあります。 文字間にスペースを使用すると、プロセスはスペースを無視し、結果の配列にはスペースがなくなります。

次のスクリプトと隣接する出力を使用して、これを理解しましょう。

read -ra var51 <<<"$(echo "FG HI JK" | sed 's/./& /g')"
echo ${var51[0]}
echo ${var51[1]}
echo ${var51[2]}
echo ${var51[3]}

出力は次のとおりです。

F
G
H
I

出力では、subscript/index 2 にスペース文字の代わりに文字 H が含まれていることが明らかです。

Bash で正規表現を使用して文字列を変数に分割する

正規表現について読むためのリンクをすでに共有しています。 ここでは、正規表現と =~ を使用した一致操作を使用して、文字列を分割する別の方法があります。

スクリプトは次のとおりです。

re="^([^-]+)-(.*)$"
[[ "31-28-31" =~ $re ]] && var6="${BASH_REMATCH[1]}" && var_r="${BASH_REMATCH[2]}"
[[ $var_r =~ $re ]] && var7="${BASH_REMATCH[1]}" && var8="${BASH_REMATCH[2]}"
echo "First:" $var6
echo "Second:" $var7
echo "Third:" $var8

ここでもハイフンが区切り文字として使用され、正規表現にはハイフンが含まれています。 出力は次のとおりです。

First: 31
Second: 28
Third: 31

次に、区切り文字のコンマが異なる同じメソッドがあります。 スクリプトは次のとおりです。

re1="^([^,]+),(.*)$"
[[ "high,risk" =~ $re1 ]] && v1="${BASH_REMATCH[1]}" && v2="${BASH_REMATCH[2]}"
echo "First:" $v1
echo "Second:" $v2

出力は次のとおりです。

First: high
Second: risk

最後に、Bash で文字列を分割して変数に格納するさまざまな方法を紹介しました。 これで、読者は自分の要件に適した方法を使用できます。

関連記事 - Bash String