как извлечь промежуточные символы из группы символов с помощью сценариев оболочки

#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]}