
다음과 같은 문자열이 있습니다 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
.txt
s/\.txt$//
read
ab_c de_fg_.txt