JSON 배열을 공백으로 구분된 문자열로 변환

JSON 배열을 공백으로 구분된 문자열로 변환

다음과 같은 JSON 파일이 있습니다.

{
 "name" : "Allow",
 "source" : [ "*" ,"0.0.0.0"]
}

JSON의 문자열 배열을 "공백으로 구분된 문자열"로 변환할 수 있도록 이 JSON을 구문 분석해야 합니다. 나중에 이 변수를 다음과 같은 다른 함수에 제공해야 합니다.

local file="file-name"
while read val; do
    local name
    local source

    name=$(jq --raw-output '.name' <<< ${val})
    source=$(jq --raw-output '.source' <<< ${val})
__test "${name}" "${source}" 
  done < <(cat ${file} | jq -rc '.[]')

따라서 기본적으로 소스를 문자열로 변경하고 문자열 목록 대신 전달해야 합니다.

답변1

join(" ")일반적으로 in을 사용하여 배열 요소를 공백으로 구분된 단일 문자열로 변환할 수 있습니다 jq. 귀하의 경우 .source해당 배열을 공백으로 구분된 string 으로 변환하는 데 사용할 수 있습니다 .source | join(" ").

귀하의 입력 문서에 귀하의 질문에 표시된 유형의 개체 배열이 포함되어 있다고 가정합니다.

jq반복할 때마다 여러 번 호출하는 대신 을 사용하여 jq데이터를 단일 스트림으로 사용할 수 있는 형식으로 변환하는 것을 고려해 보세요.

jq -r '.[] | [ .name, (.source | join(" ")) ] | @tsv' file.json |
while IFS=$'\t' read -r name source; do
    __test "$name" "$source"
done

그러면 루프에 탭으로 구분된 두 개의 필드가 제공됩니다. 첫 번째 필드는 .nameJSON 문서의 값이고, 두 번째 필드는 배열의 요소를 연결하여 형성된 공백으로 구분된 문자열입니다 .source. join()배열 요소를 단일 문자열로 연결하고 jq배열을 제공하여 탭으로 구분된 출력을 생성하려면 in을 사용합니다 .@tsv


용기가 있다면 사용해도 됩니다

eval "$( jq -r '.[] | [ "__test", .name, (.source | join(" ")) ] | @sh' file.json )"

jq이는 실행하려는 쉘 명령을 실제로 생성하는 데 사용됩니다 . 그런 다음 쉘을 호출하여 이것을 얻으십시오.스크립트문자열로 변환하고 eval. jq표현식 에서 @sh명령 이름과 해당 인수에 대한 올바른 참조를 제공하는 데 사용됩니다. 여기의 표현식에는 jq질문에 표시된 유형의 객체 배열이 필요합니다.

관련 정보