Как сделать возвращаемое значение grep без запятой

Я хочу извлечь значение из json-файла, чтобы обработать его, и я пытаюсь использовать grep '"USDEUR" currs.json' | cut -d ':' -f 2 grep '"USDEUR" currs.json' | cut -d ':' -f 2 но он возвращает 0.918695, а файл json выглядит так:

 { "success":true, "terms":"https:\/\/currencylayer.com\/terms", "privacy":"https:\/\/currencylayer.com\/privacy", "timestamp":1449232988, "source":"USD", "quotes":{ "USDEUR":0.918695, "USDGBP":0.660851, "USDPLN":3.95815 } } 

Поэтому я хочу знать, как отключить запятую, чтобы я мог обрабатывать стоимость USDEUR

Используйте парсер JSON для разбора JSON, например jq :

 $ jq '.quotes.USDEUR' file.json 0.918695 

Существует несколько способов сделать это. Вы можете передать результаты через любое из следующих

 tr -d ',' cut -d',' -f1 sed -e 's/,//' 

С чистым grep использующим регулярные выражения, совместимые с perl (опция -P ):

 grep -Po 'USDEUR":\K.*(?=,)' file 
  • \K отбросит все до :
  • (?=,) выкинет все после , (включая , )

Как правило, если вы cut вывод текстового инструмента ( grep или sed ) через cut вы уже делаете что-то неправильно. (Предлагая второй cut трубопровод еще более идиотский …)

 sed -n '/"USDEUR"/s/^.*:\(.*\),$/\1/p' 

Это использовало sed в режиме «не эхо-строки по умолчанию» ( -n ) с основным регулярным выражением POSIX и подстановкой, которая в основном говорит: во всех строках, соответствующих «« USDEUR », замените всю строку на все между двоеточие и конечную запятую, затем выведите строку.

Это не будет соответствовать, если ваша строка не имеет конечной запятой. С другой стороны, вы, кажется, знаете, что ваш ввод – это числовое поле, поэтому просто исключайте запятые:

 sed -n '/"USDEUR"/s/^.*:\([^,]*\),*$/\1/p' 

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

В противном случае использовать синтаксический анализатор JSON – это разумная вещь. Вы можете комбинировать больше регулярных выражений, чтобы также уловить строки, которые могут содержать запятые, но … это не стоит в какой-то момент, как правило.

Добавьте еще один разрез.

 grep '"USDEUR" currs.json' | cut -d ':' -f 2 | cut -d',' -f 1