Linux シェル,文字列を配列に格納し、自在に抽出する

スポンサーリンク

鍛錬 188

Linux シェルスクリプト,文字列を配列に格納し、自在に抽出する

bash の文字列操作で使用する ${::} が使用できない場合等に、指定した開始位置から指定した文字数だけ文字列を取得する方法についてです。

シェルスクリプト

以下は、指定した開始位置から指定した文字数だけ文字列を取得するシェルスクリプト str_array.sh です。
文字列 ABCDEFGHIJKLMN について、3 文字目の C から 5 文字取得しています。

以下のシェルスクリプト中で使用している「IFS」と「eval を使用した動的配列」については、別の記事にて紹介しています。

Linux シェルスクリプト,IFSを用いた文字列操作
Linux シェルスクリプト,evalを使用して、動的配列に格納する
 

#!/bin/sh

# 初期化
START_POINT=3  # 文字列の抽出を開始する位置
GET_CHAR=5     # 抽出する文字数

# 操作対象文字列を格納
str="ABCDEFGHIJKLMN"

# 合計文字数を取得
STR_COUNT=${#str}

# 文字列を1文字ずつ,改行を付加しながら格納
tmp=$(echo $str | fold -b -1)

# 改行をデリミタとして分解
IFS_backup=$IFS
IFS='
'
set -- $tmp
IFS=$IFS_backup

# 文字列の文字数に応じて動的に,1文字ずつ配列に格納
i=0
num=1
while [ $i -lt $STR_COUNT ]
do
	c=$(eval echo '$'$num)
	eval "array_$i=\"$c\""
	num=$(($num + 1))
	i=$(($i + 1))
done

# 格納した文字を表示して確認
echo "--- debug -----------------------"
i=0
while [ $i -lt $STR_COUNT ]
do
	c=$(eval echo '$array_'$i)
	array_name=$(eval echo 'array_'$i)
	echo "$array_name = $c"
	i=$(($i + 1))
done
echo "---------------------------------"

# 指定した開始位置から,指定した文字数を抽出
START_POINT=$(($START_POINT - 1))
stop_point=$(($START_POINT + $GET_CHAR))
while [ $START_POINT -lt $stop_point ]
do
	c=$(eval echo '$array_'$START_POINT)
	array_name=$(eval echo 'array_'$START_POINT)
	tmp=$get_str
	get_str=$tmp$c
	START_POINT=$(($START_POINT + 1))
done

# 抽出した文字列を表示して確認
echo "抽出した文字列 = $get_str"

実行結果

以下は、シェルスクリプト str_array.sh を実行し、文字列 ABCDEFGHIJKLMN について、3 文字目の C から 5 文字を取得しています。

***@ubuntu:~/***/test/shell$ 
***@ubuntu:~/***/test/shell$ ./str_array.sh
--- debug -----------------------
array_0 = A
array_1 = B
array_2 = C
array_3 = D
array_4 = E
array_5 = F
array_6 = G
array_7 = H
array_8 = I
array_9 = J
array_10 = K
array_11 = L
array_12 = M
array_13 = N
---------------------------------
抽出した文字列 = CDEFG

 
上記に示した通り、3 文字目の C から 5 文字目の G までを取得しています。

タイトルとURLをコピーしました