Как получить JSON STRING из данной строки

У меня строка, приведенная ниже. Мне просто нужно получить первую строчку JSON для учетной записи (полужирный шрифт ), я все пробовал .. Это не сработало. Можете ли вы помочь мне получить данные?

<START AdditionalInfo#:>[FormsGenerationServiceImpl::, accountNumber:ABC07667 , [Source System Request : {"Info":{"Holder": {"nameData": {"shortName": "McIntosh"}},**"accountHeader": {"a": "Y","b": "1","c": "4","draft": "P","e": "Y0000DU9","f": "T","g": "1"}**,"forms": {"maskSSN": "N","deliverForms": "G","selectedForms": {"T5": ["F10"],"T1": ["F1403"],"T2": ["F100001401"]}},"accountHeader": {"a": "Y","b": "1","c": "4","d": "HWA","draftRequestType": "P","e": "Y0000DU9","f": "T","g": "1"}}} ], null]<AdditionalInfo#: END> 

Мой вывод должен быть

 "accountHeader": {"a": "Y","b": "1","c": "4","draft": "P","e": "Y0000DU9","f": "T","g": "1"} 

Вот несколько вариантов:

  1. Используйте grep с флагом -o для печати только соответствующей части линии и фильтра с head чтобы получить только первое совпадение:

     grep -o '"accountHeader[^}]*}' file.json | head -n1 

    Регулярное выражение ищет "accountHeader то как можно больше "accountHeader до первого символа } . Это в основном одно и то же регулярное выражение, используемое в других нижеприведенных решениях.

  2. Используйте sed с -n для подавления печати и p после замены для печати, только если замена была успешной. Затем замените (удалите) все, кроме того, что вы хотите:

     sed -n 's/.*\("accountHeader[^}]*}\).*/\1/p' file.json 
  3. Используйте Perl, -l добавляет новую строку для каждого вызова print , -n означает «обрабатывает каждую строку входного файла» и применяет сценарий, заданный -e :

     perl -lne '/.*("accountHeader[^}]*})/ && print $1' file.json 
  4. Используйте awk , это предполагает, что ** в вашем примере ввода есть, чтобы выделить интересующую вас часть и фактически не существует в реальных данных. Если это так, это должно работать:

     awk -F'},' '{print $2"}"}' file.json 

Если ** на самом деле там, вещи еще проще, просто используйте их как полевые разделители:

 awk -F'**' '{print $2"}"}' file.json 

или

 perl -F"\*\*" -alne 'print $F[1]' file.json