배열을 문자열로 변환

배열을 문자열로 변환

다음과 같은 문자열이 있습니다 test_var=ab_c_de_fg_.txt. ab_c하나의 변수(두 번째 앞의 문자 _)와 de_fg_두 번째 변수( 두 번째 _뒤와 앞의 문자 )에 저장해야 .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

귀하의 질문에서 요구하는 작업을 수행하는 한 가지 방법은 다음과 같습니다 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.

비결은 read두 개의 변수를 읽는 것입니다. 이는 입력을 환경 변수 IFS(기본적으로 공백, 탭 및 줄 바꿈)의 현재 값으로 분할합니다. 명령은 sed두 번째 것을 공백( )으로 대체하고 입력 끝( )에서 제거하므로 전달되는 내용이 되며 중간에 공백이 있으므로 각 문자열은 해당 변수에 저장됩니다. ._s/_/ /2.txts/\.txt$//readab_c de_fg_.txt

관련 정보