Use um analisador JSON para analisar o JSON, por exemplo, jq
:
$ jq '.quotes.USDEUR' file.json
0.918695
Eu quero extrair um valor de um arquivo json para que eu possa processá-lo e eu tento usar grep '"USDEUR" currs.json' | cut -d ':' -f 2
, mas ele retorna 0.918695,
e o arquivo json se parece com isto:
{
"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
}
}
Então, quero saber como desabilitar a vírgula para que eu possa processar o valor de USDEUR
Use um analisador JSON para analisar o JSON, por exemplo, jq
:
$ jq '.quotes.USDEUR' file.json
0.918695
Existem várias maneiras de fazer isso. Você pode canalizar seus resultados através de qualquer um dos seguintes
tr -d ','
cut -d',' -f1
sed -e 's/,//'
Com grep
puro usando expressões regulares compatíveis com perl ( -P
option):
grep -Po 'USDEUR":\K.*(?=,)' file
\K
vai jogar tudo fora até :
(?=,)
descartará tudo depois de ,
(incluindo ,
) Como regra geral: se você enviar a saída de uma ferramenta de texto ( grep
ou sed
) até cut
, você já está fazendo algo errado. (Sugerir um segundo cut
pipe é ainda mais idiota…)
sed -n '/"USDEUR"/s/^.*:\(.*\),$//p'
Isso usou sed
no modo "não ecoa linhas por padrão" ( -n
) com um POSIX expressão regular básica e uma substituição, que basicamente diz: em todas as linhas correspondentes a "" USDEUR "", substitua a linha inteira por tudo entre os dois pontos e uma vírgula final, em seguida, imprima a linha.
Isso não corresponderá se sua linha não tiver uma vírgula final. Por outro lado, você parece saber que sua entrada é um campo numérico, portanto, exclua vírgulas:
sed -n '/"USDEUR"/s/^.*:\([^,]*\),*$//p'
Isso substitui tudo entre dois pontos e o final da linha que não contém dois-pontos e ignora qualquer quantidade de dois-pontos (zero ou um, já que sua entrada é supostamente válida como JSON).
Caso contrário, use um analisador JSON é a coisa mais sensata a ser feita. Você poderia reunir mais regexes para também pegar strings que podem conter vírgulas, mas ... não vale a pena em algum momento, normalmente.
Adicione outro recorte.
grep '"USDEUR" currs.json' | cut -d ':' -f 2 | cut -d',' -f 1
Tags grep text-processing