Извлечь значение json с помощью sed

У меня есть результат json, и я хотел бы извлечь строку без двойных кавычек

{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}

С помощью этого регулярного выражения я могу правильно извлечь значение3 (019-10-24T15:26:00.000Z)

sed -e 's/^.*"endTime":"\([^"]*\)".*$/\1/'

Как я могу извлечь результат «value2», строку без двойных кавычек?

I need to do with sed so can’t install jq. That’s my problem

Если у вас уже есть структурированная информация, почему бы вам не использовать парсер JSON вместо этого? Ваш подход с sed действительно подвержен ошибкам (подумайте о разрывах строк, экранированных кавычках и т. д.).

Jan 10.04.2019 10:30
jq '.value2' <<< "$jsonstring"
Wiktor Stribiżew 10.04.2019 10:35

Возможный дубликат Разбор JSON с помощью инструментов Unix

Wiktor Stribiżew 10.04.2019 10:52

Не дубликат.

Alex Harvey 11.04.2019 09:30
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
9
4
19 378
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Просто запустите jqJSON-процесс командной строкиr

$ json_data='{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}'
$ jq '.value2' <(echo "$json_data")
2.5

с помощью клавиши .value2, чтобы получить доступ к интересующему вас значению.

This link summarize why you should NOT use, regex for parsing json (the same goes for XML/HTML and other data structures that are in theory can be infinitely nested)

Regex for parsing single key: values out of JSON in Javascript

Если у вас нет jq в наличии:

вы можете использовать следующую команду GNU grep:

$ echo '{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}' | grep -zoP '"value2":\s*\K[^\s,]*(?=\s*,)'
2.5

используя регулярное выражение, подробно описанное здесь:

"value2":\s*\K[^\s,]*(?=\s*,)

демо:https://regex101.com/r/82J6Cb/1/

Это будет работать, даже если json не линеаризуется!!!!

С python это также довольно прямолинейно, и вы должны установить его по умолчанию на свой компьютер, даже если это не python3, он должен работать.

$ cat data.json 
{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}
$ cat extract_value2.py 
import json

with open('data.json') as f:
    data = json.load(f)
    print(data["value2"])
$ python extract_value2.py 
2.5

Не очень полезно. В какой упаковке jq? В какой системе такое имя? Его, конечно же, нет ни в одном пакете по умолчанию в Ubuntu или Debian. Может быть, ссылка на страницу загрузки.

coladict 10.04.2019 10:55

Мне нужно сделать с sed, поэтому я не могу установить jq. Это моя проблема.

Guif If 10.04.2019 13:32

@GuifIf, возможно, вы захотите указать это в своем вопросе, чтобы остановить поток отрицательных голосов и закрытых голосов. Также объясните, почему это должен быть sed, а не awk (еще один инструмент, который входит в стандартную комплектацию всех установок UNIX).

Ed Morton 10.04.2019 14:00

@GuifIf: я добавил поверх решения grep решение python. Таким образом, у вас должно быть достаточно инструментов, чтобы извлечь его сейчас. Ваше здоровье

Allan 10.04.2019 15:10

Для оператора регулярного выражения я бы посоветовал вам добавить класс символов вокруг финального ,, а также включить символ } (т.е. [,}]). Таким образом, вы все еще можете захватить последний объект в списке. Например: "modifier":\s*\K[^\s,]*(?=\s*[,}])

strangiato 07.04.2021 18:24

С GNU sed for -E для включения ERE:

$ sed -E 's/.*"value3":"?([^,"]*)"?.*/\1/' file
2019-10-24T15:26:00.000Z

$ sed -E 's/.*"value2":"?([^,"]*)"?.*/\1/' file
2.5

С любым POSIX sed:

$ sed 's/.*"value3":"\{0,1\}\([^,"]*\)"\{0,1\}.*/\1/' file
2019-10-24T15:26:00.000Z

$ sed 's/.*"value2":"\{0,1\}\([^,"]*\)"\{0,1\}.*/\1/' file
2.5

Вышеприведенное предполагает, что у вас никогда не будет запятых внутри строк в кавычках.

@broc.seib - так они и были! Исправлено, спасибо за наводку.

Ed Morton 22.11.2021 20:32

если ваши данные в файле «d», попробуйте gnu sed

sed -E 's/[{,]"\w+":([^,"]+)/\1\n/g ;s/(.*\n).*".*\n/\1/' d

Вы можете попробовать это:

creds=$(eval aws secretsmanager get-secret-value --region us-east-1 --secret-id  dpi/dev/hivemetastore --query SecretString --output text )
passwd=$(/bin/echo "${creds}" | /bin/sed -n 's/.*"password":"\(.*\)",/\1/p' | awk -F"\"" '{print $1}')

хотя, безусловно, можно удалить часть AWK ...

Другие вопросы по теме