2016-05-19 13 views
5

anwenden Ich verwende jq, um einen JSON zu bekommen und einige Werte zu erhalten.Regex auf JQ

Ich habe diese Saite

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

Und ich will den Teil von Aufgabe bekommen/und dann wieder nur blablabla

Vorerst ich diese Regex habe.

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

Welche geben mir zwei Gruppen.

Irgendeine Idee wie mit jq kann ich diese Regex anwenden und die zweite Gruppe bekommen?

Grüße

+0

Sind Sie Unix-Kommandozeile 'jq' verwenden? – anubhava

+0

ja, für jetzt und testen Sie es, später werde ich die Befehle zu meinem Bash-Skript bewegen – paul

Antwort

1

Auf jq 1.5 können Sie die Regex match passieren und dann die string Eigenschaft captures 'zweites Element erhalten.

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

Ich denke, ich habe dich dort durch ... 40 Sekunden geschlagen? –

+0

Sicher. Ich bin mir nicht sicher, wofür das 'select (.)' In Ihrer Antwort ist. –

+0

Das 'select (.)' Soll verhindern, dass am Ende der Ausgabe ein 'null' (oder mit' -r' eine leere Zeilenumbruch) erhalten wird - was ich in der Praxis mit dem genauen zitierten Code gesehen habe in meiner Frage ohne es. Warum ist meine Instanz von 'jq' mehr Eingabeelemente als ich beabsichtige, um sie zu füttern und somit das Spiel mehr als einmal auszuführen, ist das eine sehr gute Frage. –

1

In Ihrem BASH Skript können Sie die Ausgabe von jq nehmen und BASH String-Manipulation verwenden:

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

# check output 
echo "$r" 
blablabla 

${s##*task/} wird längsten Teil bis task/ von Anfang entfernen.

Oder Sie verwenden sed:

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

Ich suchte nach einer schicken Möglichkeit, es in der gleichen Zeile mit jq – paul

+0

Dumm Frage, gibt mir ein Zitat am Ende der zurück die string blablabla "wie kann ich das loswerden ?. Grüße – paul

+0

Wenn ich versuche xargs jq '." | sed 's ~. * Aufgabe/~~' | xargs -I {} echo {} sagt mir xargs: nicht abgeschlossenes Zitat – paul

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

... emittiert als Ausgang:

"blablabla" 

zu emittieren, dass als Ausgang String, ohne die wörtlichen Zitate, verwenden die -r Argument zu jq.

2

Warum nicht einfach sub/2 benutzen? Zum Beispiel (in Übereinstimmung mit der Regex des OP):

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

Es kann besser sein, den Fall zu behandeln, in denen die eingegebene Zeichenkette nicht enthält „: Aufgabe /“, z.B. Filterung test/1:

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

Betrachten Sie auch eine Named-Capture-Gruppe mit:

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

Etc.

+0

Dies ist der Teil, wo ich mich dafür trete, dass ich nicht daran gedacht habe. :) –