LINUX.ORG.RU

Разделить массив в JSON

 , , ,


0

1

Есть задача разделить строку «{1},{2},{3}» на несколько строк «1\n2\n3». 123 это подстроки вида «param1»:«value1», не суть. Пробую

echo "{1},{2},{3}" |  sed 's/{\(.*\)},/\1\n/'
Хотелось бы
1
2
3
Получаю
1},{2
{3}
Заменяю { и } на ( и ) - результат аналогичный, т.е. дело не в {} и не в экранировании в bash или в sed (пишут https://www.opennet.ru/docs/RUS/bash_scripting_guide/c11895.html, что {} воспринимаются как обычные символы). ЧЯДНТ?

Ответ на: комментарий от Deleted

Да делов то. Почему бы и нет? sed, awk, bash есть везде. А jq я попробовал, да, работает. Мне в принципе интересно, ЧЯДНТ.

bugs-bunny
() автор топика

ну сделай в несколько проходов, в чём вопрос то

echo "{1},{2},{3}" |  sed -e 's/},/\n/g' -e 's/{//g' -e 's/}//'

zolden ★★★★★
()
Ответ на: комментарий от bugs-bunny

Твоя регулярка захватывает почти всю строку, нужен нежадный режим, но sed в него не умеет. Вариант на перле:

echo "{1},{2},{3}" |  perl -pe 's/\{(.*?)\},?/\1\n/g'

Deleted
()
Последнее исправление: MyLittleLoli (всего исправлений: 1)

у тебя вообще не JSON в примере. JSON это {key: value}. у тебя чего-то не хватает

anonymous
()
Ответ на: комментарий от anonymous

Да, правильно, это кусок JSON-а вытащенный из [] из этого

{«count»:2,«value»:[{«id»:«15764»,«url»:"http://xxx/workItems/15764"},{«id»:«15754»,«url»:"http://xxx//workItems/15754"}]}

Вообще вот что там делается

#выкачивается JSON c M$ TFS сервера
ResponseJSON=`curl --ntlm --user user:pass  --request GET -H "Content-Type: application/json" $WorkItemAssociatedURL`
# Обрубаются {}
ResponseJSON=`echo $ResponseJSON | sed 's/^{//' | sed 's/}$//'`
CountWorkitems=`echo $ResponseJSON | sed 's/\("count":\)\([0-9]*\).*$/\2/'`
WorkitemUrlArray=`echo $ResponseJSON | sed 's/^.*"value":\[\(.*\)\].*$/\1/'`
# тот самый затык, о котором я спрашивал
WorkitemUrlArray=`echo $WorkitemUrlArray | sed -e 's/},/\n/g' -e 's/{//g' -e 's/}//'`

for i in $WorkitemUrlArray; do
url=`echo $i | sed 's/^.*"url":"\(.*\)".*$/\1/'`
# разные манипуляции
done

Так что с помощью sed-а можно все прекрасно распарсить.

bugs-bunny
() автор топика

Дело в жадности символа *.
Надо так: echo "{1},{2},{3}" | sed 's/{\([^}]*\)},\?/\1\n/g', или, если не хочется последнего перевода строки, то так: echo "{1},{2},{3}" | sed 's/{\([^}]*\)},\?/\1\n/g; s/\n$//'

evilface ★★
()

Я, обычно, делаю наоборот:

's/},{/\n/g'
DonkeyHot ★★★★★
()
Ответ на: комментарий от bugs-bunny

Всю эту лапшу можно заменить на

for url in `curl --ntlm --user user:pass --request GET -H "Content-Type: application/json" $WorkItemAssociatedURL | jq '.value[].url'`; do
 ...
done

Проще, нагляднее, надёжнее.

Jini ★★
()
Ответ на: комментарий от Jini

Проще, нагляднее, надёжнее.

Проще, понятнее, надёжнее взять какой-нибудь Питон.

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.