#shell
#оболочка
Вопрос:
Мой метод curl возвращает неструктурированный json, подобный-
result":{"fields":[{"position":1,"tokenized":false,"startOffset":0,"endOffset":0,"primary":false,"fieldBusinessName":"id"...
Теперь из этого json я хочу знать значение primary, является ли оно true или false .
Поскольку в возвращаемом json все слова объединены, я подумываю о том, чтобы взять символы между «primary»: и»fieldBusinessName» . Это решит мою проблему. Возможно ли это.
Примечание: Это нерасчлененный json, и в нем все слова объединены
Комментарии:
1. Обычный совет: используйте надлежащий анализатор вместо взлома регулярного выражения (язык, который принципиально не может анализировать JSON). Пожалуйста, покажите полный образец ваших данных.
Ответ №1:
Вы можете сделать это с помощью простого сопоставления с шаблоном:
#!/bin/bash
temp="${1##*primary":}"
result="${temp//,*/}"
echo "primary is: $result"
exit 0
Использование:
$ ./primary.sh 'result":{"fields":[{"position":1,"tokenized":false,"startOffset":0,"endOffset":0,"primary":false,"fieldBusinessName":"id"...'
Результат:
primary is: false
Комментарии:
1. вы заключали входные данные в одинарные кавычки? Посмотрите на мое использование. Вы должны заключить эту длинную строку в одинарные кавычки
'
. Здесь все работает нормально. Также вы сделали скрипт исполняемым? если нет, то выполнитеbash primary.sh 'long string'
Ответ №2:
Используя gnu awk
:
awk -F: '$1==""tokenized""{print $2}' RS='[,{}]' file
false
Ответ №3:
Некоторые оболочки, такие как Bash или Zsh, имеют возможности сопоставления регулярных выражений.
Вот простое решение:
json="$(curl url)"
[[ $json =~ primary":([a-z] ),"fieldBusinessName ]] amp;amp; echo ${BASH_REMATCH[1]}