Подтвердить что ты не робот

Grep: групповой захват

У меня есть следующая строка:

{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}

и мне нужно получить значение "версии схемы", которое в этом примере составляет 1234.

Я пробовал

grep -Eo "\"scheme_version\":(\w*)"

однако он возвращает

"scheme_version":1234

Как я могу это сделать? Я знаю, что могу добавить вызов sed, но я бы предпочел сделать это с помощью одного grep.

4b9b3361

Ответ 1

Это может сработать для вас:

echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' |
sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p'
1234

Извините, но не grep, поэтому не обращайте внимания на это решение, если хотите.

Или вставьте grep и добавьте:

grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2

Ответ 2

Вам нужно будет использовать внешний вид утверждения, чтобы он не включался в соответствие:

grep -Po '(?<=scheme_version":)[0-9]+'

Ответ 3

Я бы рекомендовал вам использовать jq для задания. jq - это процессор JSON с командной строкой.

$ cat tmp
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}

$ cat tmp | jq .scheme_version
1234

Ответ 4

В качестве альтернативы положительному методу lookbehind, предложенному SiegeX, вы можете reset отправную точку матча непосредственно после scheme_version": с помощью escape-последовательности \K. Например.

$ grep -Po 'scheme_version":\K[0-9]+'

Это перезапустит процесс сопоставления после согласования scheme_version": и имеет тенденцию иметь гораздо лучшую производительность, чем положительный lookbehind. Сравнение двух в regexp101 демонстрирует, что метод начала матча reset принимает 37 шагов и 1 мс, тогда как метод положительного lookbehind занимает 194 шага и 21 мс.

Вы можете сравнить производительность самостоятельно на regex101, и вы можете больше узнать о сбросе начальной точки матча в документация PCRE.

Ответ 5

Вы можете сделать это:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'