Оболочка разделить строку и преобразовать ее в json формат объектов - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть строка в этом формате:

string= "[one,two,three,four,five]"

Я хочу преобразовать ее в json формат, вероятно, без использования какого-либо специфицированного c инструмента (jq или другого ), Я хочу сделать это с чистой оболочкой:

[
{"id" : 0 , "word": "one"} , 
{"id" : 1 , "word": "two"} , 
{"id" : 2 , "word": "three"} , 
{"id" : 3 , "word": "four"} , 
{"id" : 4 , "word": "five"}
]

Предложения?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Это может быть все еще утомительно, но как насчет:

string="[one,two,three,four,five]"

out=$(while read -r -d, i; do
    printf '{"id" : %d , "word": "%s"},\n' "$((c++))" "${i%]}"
done <<< "${string#[},")
printf "[\n%s\n]\n" "${out%,}"

Вывод:

[
{"id" : 0 , "word": "one"},
{"id" : 1 , "word": "two"},
{"id" : 2 , "word": "three"},
{"id" : 3 , "word": "four"},
{"id" : 4 , "word": "five"}
]
0 голосов
/ 18 февраля 2020

Нет законных оснований не использовать tr или jq для этого. В частности, вы не можете использовать read -d, как показано ниже, но это так абсурдно с agile, что не стоит беспокоиться о переносимости. Это работает в bash:

$ string="[one,two,three,four,five]"
$ c=0; echo '['; while read -d , i; do 
    echo "{\"id\" : $((c++)), \"word\": \"${i%]}\"},"
done <<< "${string#[}",; echo ']'; 
[
{"id" : 0 , "word": "one"},
{"id" : 1 , "word": "two"},
{"id" : 2 , "word": "three"},
{"id" : 3 , "word": "four"},
{"id" : 4 , "word": "five"},
]

В настоящее время я не могу придумать чистого способа устранения запятой без tr (хотя я полагаю, вы могли бы использовать довольно банальную if test "$c" -eq 5; then ...., но это скучно) поэтому я просто предлагаю:

c=0; echo '['; while read -d , i; do  
    printf "{\"id\" : $((c++)), \"word\": \"${i%]}\"}";
    expr $c = 5 | tr 10 ' ,'; done <<< "${string#[}",; echo ']'

Я еще раз повторю, что это нелепо от agile и имеет значение только как упражнение. Используйте jq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...