配列を文字列に変換

配列を文字列に変換

次の文字列がありますtest_var=ab_c_de_fg_.txtab_c1つの変数(2番目の前の文字_)とde_fg_2番目の変数(2番目の_後ろと前の文字)に保存.txtする必要があります。

test_var=ab_c_de_fg_.txt

for ((i=0;i<{#test_var};i++))
do
    a[$i]="${var:$i:1}"
done

flag=0
temp=0

while [["$temp" -le "${#test_var}"]]
do
    if a[temp] -eq "_" && flag -eq 0
    flag = 1
    continue
fi

if a[temp] -eq "_" && flag -eq 1
#var1=arr[0] to arr[$(temp-1)]
#var2=arr[$(temp+1)] to arr[#(test_var)]
fi

temp=$((temp+1))
done

私はシェルスクリプトに初めて触れますのでご案内ください。ありがとうございます。

答え1

文字列を配列に分割するには、分割+グローブ演算子(リストのコンテキストで引用符で囲まれていない引数拡張を保持するときに呼び出されます)を使用できます。

test_var=ab_c_de_fg_.txt
root_name=${test_var%.*} # remove extension

IFS=_         # split on _
set -o noglob # disable glob part
array=( $root_name"" ) # split+glob, preserve empty trailing element if any

typeset -p arrayこれにより、次のような内容が表示されます。

typeset -a array=(ab c de fg '')

配列の要素を最初の文字(kshのバイト)に関連付けるには、次の手順を実行する$IFS必要があります"${array[*]}"

だから:

printf '%s\n' "${array[*]:0:2}" "${array[*]:2}"

出力されます:

ab_c
de_fg_

両方の変数は次のように定義できます。

first_part="${array[*]:0:2}" second_part="${array[*]:2}"

答え2

あなたの質問で必要なことを行う1つの方法は次のとおりですbash(あなたが望むものを理解できないので、コードを無視してください)。

$ test_var=ab_c_de_fg_.txt
$ read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')
$ echo "$var1"
ab_c
$ echo "$var2"
de_fg_

スクリプトでは次のようになります。

test_var=ab_c_de_fg_.txt
read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')

今あなた$var1$var2

秘密はread2つの変数を読むことです。これは、入力を環境変数IFS(デフォルトでは空白、タブ、および改行)の現在の値に分割します。コマンドは、sed2番目のものをスペース()で置き換え、入力の終わり()から削除するため、渡される内容になり、途中にスペースがあるため、各文字列はその変数に格納されます。 。_s/_/ /2.txts/\.txt$//readab_c de_fg_.txt

関連情報