2016-12-11 3 views
0

에 루프가 나는, JSON의 한 조각으로 병합과 같이해야 할 두 변수와 while 루프있는 동안 :쉘 JSON

{ "From": "foo", "To": "bar" } 
{ "From": "what", "To": "ever" } 

: 현재 유효 JSON 출력

#!/bin/bash 
while read -r from to 
do 
    # BONUS: Solution would ideally require no quoting at this point 
    echo { \"From\": \"$from\", \"To\": \"$to\" } 
done << EOF 
foo bar 
what ever 
EOF 

[ 
{ "From": "foo", "To": "bar" }, 
{ "From": "what", "To": "ever" } 
] 

내가 jq 보았다하지만 난 F 없습니다 : 간단한 무엇 내가 좋아하는 유효한 JSON을 만들 수 있습니다 그것을하는 방법을 알아보십시오. 나는 쉼표를 붙이는 느낌이 들기 때문에 나는 이상적으로 looking to do it in shell이 아니며 약간 추한 것입니다. JQ와

+1

껍질에는 우울함이 문제가되지 않습니다. 문제는'$ from'과'$ to'의 내용을 모른 채로 값이 JSON 값을 적절히 인용한다는 것을 보장 할 수 없다는 것입니다. 또한 적어도 쉘이 처리 할 수있는 문제를 처리하기 위해서는'printf '{ "From": "% s", "To": "% s"} ""$ from ""$ to " . – chepner

답변

3

는 :

$ jq -nR '[inputs | split(" ") | {"From": .[0], "To": .[1]}]' <<EOF 
foo bar 
what ever 
EOF 

[ 
    { 
    "From": "foo", 
    "To": "bar" 
    }, 
    { 
    "From": "what", 
    "To": "ever" 
    } 
] 

-n는 입력을 읽을 수 없습니다하는 JQ를 알려줍니다; -R은 원시 입력이므로 JSON을 기대하지 않습니다.

$ jq -nR 'inputs' <<EOF 
foo bar 
what ever 
EOF 
"foo bar" 
"what ever" 

다음 단어의 배열로 분할이 :

이 입력은 입력 한 줄에 하나의 문자열의 결과로, inputs와 읽기이에서

$ jq -nR 'inputs | split(" ")' <<EOF 
foo bar 
what ever 
EOF 

[ 
    "foo", 
    "bar" 
] 
[ 
    "what", 
    "ever" 
] 

, 우리는 개체를 구성 :

$ jq -nR 'inputs | split(" ") | {"From": .[0], "To": .[1]}' <<EOF 
foo bar 
what ever 
EOF 

{ 
    "From": "foo", 
    "To": "bar" 
} 
{ 
    "From": "what", 
    "To": "ever" 
} 

마지막으로 우리는 []을 사용하여 첫 번째로 표시된 최종 출력을 얻습니다. 따라서

$ jq -R '[split(" ") | { "From": .[0], "To": .[1] }]' <<EOF 
foo bar 
what ever 
EOF 

[ 
    { 
    "From": "foo", 
    "To": "bar" 
    } 
] 
[ 
    { 
    "From": "what", 
    "To": "ever" 
    } 
] 

다소 성가신 -n/inputs : 입력 라인에 하나씩 배열 [] 결과에 모두 배치 때문에

분할 입력의 더 직관적 방법은 직접 실패. inputs에는 jq 버전 1.5가 필요합니다.

1

은 여기 "에서"와 가정 모두-JQ 솔루션입니다 값은 정확히 예에서와 같이되게됩니다 "을":

jq -R -n '[inputs | split(" ") | {From: .[0], To: .[1]}]' 

당신은 gsub/2를 사용하여 추가 공간을 처리 할 수 ​​있습니다.

당신의 JQ가 inputs 다음이 주문 사용할 수없는 경우 :

jq -R -s 'split("\n") 
    | map(select(length>1) | split(" ") | {From: .[0], To: .[1]})' 

을 아니면 jq -s에 단지 파이프 당신의 동안 루프의 출력을 할 수있다.