Como fazer o valor de retorno do grep sem vírgula [duplicado]

2

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

    
por TimDrake28 23.12.2015 / 19:38

5 respostas

11

Use um analisador JSON para analisar o JSON, por exemplo, jq :

$ jq '.quotes.USDEUR' file.json 
0.918695
    
por 23.12.2015 / 20:03
5

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/,//'
    
por 23.12.2015 / 19:45
3

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 , )
por 23.12.2015 / 19:50
2

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.

    
por 23.12.2015 / 22:30
0

Adicione outro recorte.

grep '"USDEUR" currs.json' | cut -d ':' -f 2 | cut -d',' -f 1
    
por 23.12.2015 / 19:44