2016-05-19 17 views
5

Sto usando jq per ottenere un json e ottenere alcuni valori.Applicare regex su JQ

ho questa stringa

"arn:aws:ecs:eu-west-1:foo:task/blablabla" 

e voglio ottenere la stringa da Task/e poi tornare solo blablabla

Per ora ho questo regex.

(.*task?)\/(.*$) 

Quali mi danno due gruppi.

Qualche idea su come utilizzare jq I può applicare questo regex e ottenere il secondo gruppo?

saluti

+0

Si sta utilizzando la linea di comando UNIX 'jq'? – anubhava

+0

sì, per ora e testarlo, in seguito sposterò i comandi sul mio script bash – paul

risposta

1

Su jq 1.5, è possibile passare la regex a match e quindi ottenere la proprietà string di captures 'secondo elemento.

jq 'match("(.*task?)\/(.*$)").captures[1].string' 
+0

Penso di averti battuto lì da ... 40 secondi? –

+0

Sicuro. Non sono sicuro di cosa sia il 'select (.)' Nella tua risposta. –

+0

Il 'select (.)' È per evitare di ottenere un 'null' (o, con' -r', una newline vuota) alla fine dell'output - cosa che ho visto, in pratica, con il codice esatto quotato nella mia domanda senza di essa. Per quanto riguarda il motivo per cui la mia istanza di 'jq' sta vedendo più elementi di input di quanto pensassi per nutrirlo, e quindi eseguire la partita più di una volta, questa è un'ottima domanda. –

1

nello script BASH si può prendere l'uscita di jq e utilizzare BASH manipolazione di stringhe:

s='arn:aws:ecs:eu-west-1:foo:task/blablabla' 
r="${s##*task/}" 

# check output 
echo "$r" 
blablabla 

${s##*task/} rimuoverà parte più lunga fino task/ dall'inizio.

Oppure si può utilizzare sed:

jq '.selector' | sed 's~.*task/~~' 
+0

stavo cercando un modo elegante per farlo nella stessa riga con jq – paul

+0

domanda stupida, mi sta restituendo un preventivo alla fine di la stringa blablabla "come posso liberarmene?" Cordiali saluti – paul

+0

Quando provo xargs jq "." | sed 's ~. * task/~~' | xargs -I {} echo {} mi sta dicendo xargs: preventivo non terminato – paul

2
json_string='"arn:aws:ecs:eu-west-1:foo:task/blablabla"' 
jq 'match("^(.*task?)\/(.*$)", .) | .captures[1].string | select(.)' <<<"$json_string" 

... emette come output:

"blablabla" 

per emettere che come una stringa prima, senza le virgolette letterali, utilizzare il -r argomento a jq.

2

Perché non usare solo sub/2? Per esempio (in linea con regex del PO):

$ jq -r 'sub(".*task/"; "")' <<< '"arn:aws:ecs:eu-west-1:foo:task/blablabla"' 
blablabla 

Può essere meglio per gestire il caso in cui la stringa di input non contiene ": attività /", ad esempio filtraggio utilizzando test/1:

select(test(":task/")) | sub(".*:task/"; "") 

Anche considerare l'utilizzo di un gruppo di cattura denominata:

jq -r 'sub(".*:task/(?<x>.*)"; "\(.x)")' <<< '"arn:aws:ecs:eu-west-1:foo:task/blablabla"' 
blablabla 

Ecc

+0

Questa è la parte in cui mi prendo a calci per non averci pensato. :) –