Grep: групповой захват
У меня есть следующая строка:
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
и мне нужно получить значение "версии схемы", которое в этом примере составляет 1234.
Я пробовал
grep -Eo "\"scheme_version\":(\w*)"
однако он возвращает
"scheme_version":1234
Как я могу это сделать? Я знаю, что могу добавить вызов sed, но я бы предпочел сделать это с помощью одного grep.
Ответы
Ответ 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 '}'