이 배열을 변환해야 합니다.
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단계로 이루어지기 때문에 이 결과는 간단합니다.