У меня есть результат 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
jq '.value2' <<< "$jsonstring"
Возможный дубликат Разбор JSON с помощью инструментов Unix
Не дубликат.
Просто запустите jq
JSON-процесс командной строки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. Может быть, ссылка на страницу загрузки.
Мне нужно сделать с sed, поэтому я не могу установить jq. Это моя проблема.
@GuifIf, возможно, вы захотите указать это в своем вопросе, чтобы остановить поток отрицательных голосов и закрытых голосов. Также объясните, почему это должен быть sed, а не awk (еще один инструмент, который входит в стандартную комплектацию всех установок UNIX).
@GuifIf: я добавил поверх решения grep
решение python
. Таким образом, у вас должно быть достаточно инструментов, чтобы извлечь его сейчас. Ваше здоровье
Для оператора регулярного выражения я бы посоветовал вам добавить класс символов вокруг финального ,
, а также включить символ }
(т.е. [,}]
). Таким образом, вы все еще можете захватить последний объект в списке. Например: "modifier":\s*\K[^\s,]*(?=\s*[,}])
С 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 - так они и были! Исправлено, спасибо за наводку.
если ваши данные в файле «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 ...
Если у вас уже есть структурированная информация, почему бы вам не использовать парсер
JSON
вместо этого? Ваш подход сsed
действительно подвержен ошибкам (подумайте о разрывах строк, экранированных кавычках и т. д.).