배열에서 특정 정보를 얻으십시오.

배열에서 특정 정보를 얻으십시오.

이 배열을 변환해야 합니다.

arr=("aa:" "info" "{" "bb:" "name" "value" "50;" "bb:" "surname" "oth_value" "50;" "bb:" "age" "number" "3;" "bb:" "about" "text" "void;" "}")

이 같은:

arr=(("aa:" "info" "{") ("bb:" "name" "value" "50;") ("bb:" "surname" "oth_value" "50;") ("bb:" "age" "number" "3;") ("bb:" "about" "text" "void;") ("}"))

목표는 내부의 각 배열에 대해 작업을 수행할 수 있도록 다차원 배열을 반복하는 것입니다. 예를 들어:

for i in "${!arr[@]}"; do
   echo "${arr[i][0]}"
   # prints out the first value of each element
   echo "${arr[i][1]}"
   # prints out the second value of each element
done

나에게 필요한 것은 정보를 분리하고 bb:정보 ;의 각 요소를 사용할 수 있는 것입니다. 예를 들어 에코하십시오. 내 마음에 떠오르는 유일한 아이디어는 필요한 정보를 기본 배열 내부의 별도 배열에 넣고(다차원을 생성하기 위해) 이를 반복할 때 필요한 값을 사용하는 것입니다. 기본적으로 bb:와 사이에는 3개의 값만 존재합니다 ;. 그러나 이것 bb:과 부품 의 수는 ;무한합니다. 그리고 끊어야 합니다 aa: info {. }나는 그것들이 필요하지 않습니다.

답변1

arr=("aa:" "info" "{" "bb:" "name" "value" "50;" "bb:" "surname" "oth_value" "50;" "bb:" "age" "number" "3;" "bb:" "about" "text" "void;" "}")
for ((i=3; i + 4 < ${#arr[@]}; i+=4))
do
    echo "${arr[i]}"
    echo "${arr[i + 1]}"
    echo "${arr[i + 2]}"
    echo "${arr[i + 3]}"
done

이것은 간단하다C 스타일 for 루프. 관심을 두지 않으려는 필드는 무시하고 숫자를 변경할 수 있습니다.


이 배열이 원래 어디에서 왔는지에 관계없이 일반적으로 소스 텍스트에 적절한 구문 분석기를 사용하는 것이 거의 확실히 더 나을 것이지만 이는 잘 설명하는 시나리오를 만족시킵니다. 그러나 일단 더 복잡해지면 훨씬 더 어려워집니다. 순전히 4단계로 이루어지기 때문에 이 결과는 간단합니다.

관련 정보