Bash Shell - 文字列 切り出し(substring、split)

LinuxののBash shellから文字列を切る方法を紹介します。

1. 特定の範囲の文字列を切り捨てる

次のようなSyntaxで特定のIndexの範囲の文字列をカットすることができます。 offsetは、文字列が始まるindexを入力し、lengthはoffsetから切りたい長さを入力します。

echo "${STR:offset:length}"

次のコードは、Index 0から5つの文字まで切って str変数に格納します。

#!/bin/bash
str="Hello, World, Bash!"
echo "${str:0:5}"

Output:

$ bash example.sh
Hello

1.1 特定範囲の文字列の切り捨て(2)

次のようにlengthを入力しないとoffsetから文字列まで切り捨てられます。

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:7}"

Output:

$ bash example.sh
World, Bash!

1.2 文字列の後ろから切り抜く

次のようにoffsetを負に設定すると、文字列の後ろからoffsetを計算します。 str変数のoffset -5Bの位置になります。そしてlengthを入力していないので、文字列最後まで切り捨てられます。

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:(-5)}"

Output:

$ bash example.sh
Bash!

lengthを入力すると、offsetで入力した長さだけの文字列を切り捨てます。

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:(-5):2}"

Output:

$ bash example.sh
Bash!

2. cut命令で文字列を切り捨てる

2.1文字1個抽出

cut -c 8は、文字列で8番目の文字をカットします。

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8

Output:

$ bash example.sh
W

もし cut -c 8,12ように入力すれば、8番目と12番目の文字が抽出されます。

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8,12

Output:

$ bash example.sh
Wd

2.2 特定の範囲の文字列の切り捨て

cutに設定した範囲の文字列を抽出することができます。 cut -c Start-Endよう切りたい文字列の範囲を指定することができます。注意するのは、文字列のOffsetは1から始まります。

次の例では、 cut -c 8-12は8番目から12番までの文字列を切り捨てます。

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8-12

Output:

$ bash example.sh
World

2.3 範囲指定時、文字列終了範囲省略

次のように文字列の末尾の範囲を指定しない場合は、文字列最後まで切り捨てられます。

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8-

Output:

$ bash example.sh
World, Bash!

2.4 範囲指定時、文字列開始範囲省略

次のように文字列の開始範囲を指定しない場合、文字列の最初のから最後の範囲までカットします。

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c -5

Output:

$ bash example.sh
Hello

3. パターンで特定の文字列を切り取る

文字列内のパターンを探して、その文字を削除することができます。文字列に基づいて短く一致するパターンがあり、長く一致するパターンがありますが、コマンドに応じて任意のパターンを削除するかを決定することができます。

3.1 最初の文字列を含む、最も短く一致する文字列を削除する

${STR#PATTERN}はSTR変数の文字列の中に、最初の文字列を含み、パターンに一致する文字列を検索します。その中で最も短く一致するパターンを削除します。

次の例の文字列で A*Bパターンを見つけた場合は、AAABが最も短く一致するパターンであり、 AAABBBが最も長く一致するパターンです。実行結果を見れば最も短く一致する文字列が削除されます。

#!/bin/bash

str="AAABBBCCC"
echo ${str#A*B}

Output:

$ bash example.sh
BBCCC

3.2 最初の文字列を含む、最も長く一致する文字列を削除する

${STR##PATTERN}はSTR変数の文字列の中に、最初の文字列を含むパターンと一致する文字列を検索します。その中で最も長く一致するパターンを削除します。

次の例の文字列で A*Bパターンを見つけた場合は、AAABが最も短く一致するパターンであり、 AAABBBが最も長く一致するパターンです。実行結果を見れば、最も長く一致する文字列が削除されます。

#!/bin/bash

str="AAABBBCCC"
echo ${str##A*B}

Output:

$ bash example.sh
CCC

3.3 最後の文字列を含む、最も短く一致する文字列の削除

${STR%PATTERN}はSTR変数の文字列の中に、最後の文字列を含むパターンと一致する文字列を検索します。その中で最も短く一致するパターンを削除します。

次の例の文字列で B*Cパターンを見つけた場合は、BCCCが最も短く一致するパターンであり、 BBBCCCが最も長く一致するパターンです。実行結果を見れば最も短く一致する文字列が削除されます。

#!/bin/bash

str="AAABBBCCC"
echo ${str%B*C}

Output:

$ bash example.sh
AAABB

3.4 最後の文字列を含む、最も長く一致する文字列の削除

${STR%%PATTERN}はSTR変数の文字列の中に、最後の文字列を含むパターンと一致する文字列を検索します。その中で最も長く一致するパターンを削除します。

次の例の文字列で B*Cパターンを見つけた場合は、BCCCが最も短く一致するパターンであり、 BBBCCCが最も長く一致するパターンです。実行結果を見れば、最も長く一致する文字列が削除されます。

#!/bin/bash

str="AAABBBCCC"
echo ${str%%B*C}

Output:

$ bash example.sh
AAA

4. 特定の文字に文字列を分割する

cutコマンドを使用するときに区切り文字を指定することができ、その区切りを基準に文字列を分割することができます。

cut -d -f1は、文字列で に基づいて、文字列を分離し、分離された文字列の中の最初の文字列を strに保存します。もし第二の分離された文字列を取得したい場合 -f2と指定します。

#!/bin/bash

str="Hello:World:Bash"

echo $str | cut -d ':' -f1
echo $str | cut -d ':' -f2
echo $str | cut -d ':' -f3

Output:

$ bash example.sh
Hello
World
Bash

References

codechachaCopyright ©2019 codechacha