2016-01-18 1 views
0

Моя цель - использовать файл оболочки для разбора текста из wit.ai, и я не могу понять, что строка (с именем data) может быть совершенно иной. Я пытался использовать команду sed, но не повезло. Ответ от разъединять выглядит следующим образом (но имейте в виду, что это может быть разного размера):Shell Script для разбора текста в две отдельные строки

data= 
    {"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}]} 

Я хотел бы разобрать на две строки по имени text и intent.

Желаемый результат должен быть две строки следующим образом

text=  "testing" 
intent=  "weather" 

код у меня до сих пор является:

data='{"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}$ 
text=$(echo $data | cut -d"," -f1)  #removes text down to testing but leaves a quote at the end 
text=$(echo "${text::-1}")    # this line removes the quote 
echo $data 
echo $text 

Текущий результат: {"status":"ok"}{"_text":"testing

Я близко я просто нужно удалить {"status":"ok"}{"_text":", поэтому я остался с testing. Я близок, но я не могу представить эту последнюю часть.

+1

является то, что первый или второй «текст»? Как выглядит ваша команда sed? –

+0

Что означают эти данные *? Как это интерпретировать? Каким образом это может варьироваться между ответами? '' _text ":" testing "' находится там дважды. Как эти два экземпляра отличаются? –

+0

Вхождения «_text»: «тестирование» никогда не отличаются друг от друга. – Accentrix

ответ

0

Правильный способ иметь дело с JSON, чтобы использовать анализатор. Есть множество вариантов, например:

  • jq, то "Grep, СЭД & AWK для JSON"
  • JSON.sh, парсер написанный в Bash (и официально рекомендованной www.json.org)
  • json_pp, довольно принтер в Perl

проблема со всеми этими и ваш data, что они жалуются, что он неверен, если они будут работать, вы можете напрямую запросить свои данные, как показано во всех руководствах вышеперечисленных инструментов.

Поскольку вы не можете, мы снова вернемся к тексту с текстом. Мы могли бы извлечь данные, представляющие интерес с grep -o, которые возвращают только то, что он соответствует:

$ grep -o -e '"_text":"[^"]*"' -e '"intent":"[^"]*"'<<< "$data" 
"_text":"testing" 
"_text":"testing" 
"intent":"weather" 

регулярное выражение бит "[^"]*" означает «цитата, то ноль или более не кавычки, а затем еще одна цитата» – способ, чтобы соответствовать все между двумя кавычками, без жадности.

Чтобы обработать это дальше, мы можем избавиться от дублированной линии с uniq, а затем использовать СЭД, чтобы удалить кавычки и подчеркивание и, наконец, заменить двоеточие с знаком равенства и вкладок:

$ grep -o -e '"_text":"[^"]*"' -e '"intent":"[^"]*"'<<< "$data" | 
uniq | sed -r 's/"_?(.*)":(.*)/\1=\t\2/' 
text= "testing" 
intent= "weather" 
0

Хорошо это не совсем элегантно, но это, кажется, работает

data='{"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}$ 
text=$(echo $data | cut -d"," -f1)  #removes text down to testing but leaves a quote at the end 
text=$(echo "${text::-1}")    # this line removes the quote 
text=$(echo $text | cut -d"_" -f2)  # removes beginning but still leaves "text":"" 
text=$(echo $text | cut -d":" -f2)  # removes beginning but still leaves """ atr the beginning 
text=$(echo ${text:1}) 
echo $data 
echo $text 
Смежные вопросы