2016-05-19 32 views
5

Używam jq, aby uzyskać json i uzyskać pewne wartości.Zastosuj regex na JQ

Mam ten ciąg

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

I chcę, aby uzyskać podciąg z zadania /, a następnie powrócić tylko blablabla

Na razie mam tego regex.

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

Które dają mi dwie grupy.

Każdy pomysł, jak używać jq Czy mogę zastosować to wyrażenie regularne i uzyskać drugą grupę?

Pozdrowienia

+0

Używasz wiersza poleceń systemu UNIX 'jq'? – anubhava

+0

Tak, na razie przetestuj to, później przeniesię polecenia do mojego skryptu bash – paul

Odpowiedz

1

W jq 1.5 można przekazać wyrażenie regularne do match, a następnie uzyskać właściwość string z drugiego elementu .

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

Myślę, że pokonałem cię przez ... 40 sekund? –

+0

Pewnie. Nie jestem jednak pewien, do czego służy 'select (.)' W twojej odpowiedzi. –

+0

'select (.)' Zapobiega pobieraniu 'null' (lub, z' -r', pustym znakiem nowej linii) na końcu wyjścia - co widziałem, w praktyce, z dokładnym kodem cytowanym w moim pytaniu bez tego. Jeśli chodzi o to, dlaczego moje wystąpienie 'jq' zawiera więcej elementów wejściowych, niż zamierzałem to podać, i tym samym uruchamiam mecz więcej niż jeden raz, jest to bardzo dobre pytanie. –

1

w skrypcie BASH można wziąć wyjście z jq i używać BASH manipulacji ciąg:

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

# check output 
echo "$r" 
blablabla 

${s##*task/} usunie najdłuższą część zapisu do task/ od początku.

Albo można użyć sed:

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

Szukałem fantazyjnego sposobu zrobienia tego w tej samej linii z jq – paul

+0

Głupie pytanie, zwraca mi cytat na końcu string blablabla "jak mogę się tego pozbyć?" Pozdrawiam – paul

+0

Kiedy próbuję xargs jq '.' | sed 's ~. * task/~~' | xargs -I {} echo {} mówi mi xargs: nieokreślony cytat – paul

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

... emituje jako wyjście:

"blablabla" 

emitować że jako surowiec ciągiem, bez dosłownych cytatów, użyj -r argument do jq.

2

Dlaczego po prostu nie używać sub/2? Na przykład (zgodnie z wyrażenia regularnego na OP)

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

może lepiej obsługiwać przypadek, w którym łańcuch wejściowe nie zawierają „: Zadanie /” np Filtrowanie przy użyciu test/1:

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

Rozważmy również przy użyciu grupę o nazwie przechwytywania:

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

Etc.

+0

To jest ta część, w której się rzucam, bo o niej nie myślałem. :) –