Использование sed для поиска значения с учетом регулярного выражения

Я пытаюсь получить значение из вывода. Скажем, мне нужно свойство id этого json-объекта:

{"id":123,"useless1":"uselessValue","useless2":uselessValue}

Я пробовал это:

a={"id":123,"useless1":"uselessValue","useless2":uselessValue}
echo $a | sed -e s/.*"id":(\d+).*/$1/g

Но возвращает {"id":123,"useless1":"uselessValue","useless2":uselessValue}

Еще пробовал этот пример

Если я скопирую:

echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g'

Я получил:

12 BBQ ,45 rofl, 89 lol

Вместо 45

Я использую MacOs High Sierra (10.13.6)

Команда sed должна выглядеть как sed -e 's/.*"id":\([0-9][0-9]*\).*/\1/'. Разве вы не можете использовать jq для анализа JSON?

Wiktor Stribiżew 31.10.2018 11:30

Ой! Работает ... Спасибо.

Sharcoux 31.10.2018 11:34

В моем случае лучше придерживаться этого.

Sharcoux 31.10.2018 11:34

Это не так, если вы не проанализируете тот же самый JSON, который никогда не изменится, и в этом случае нет необходимости ничего анализировать.

choroba 31.10.2018 11:48

Да, понятно, это не совсем правильный JSON. uselessValue следует заключать в двойные кавычки. Разве что вы вручную "испортили" структуру JSON.

Wiktor Stribiżew 31.10.2018 11:48

Просто мне нужен только идентификатор, я достаточно уверен в структуре json, и для моего варианта использования важнее не полагаться на зависимость, чем анализировать весь JSON. В любом случае большое спасибо за вашу помощь

Sharcoux 31.10.2018 14:11
0
6
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете jq, это будет так же просто, как

jq '.id' file

Если вы хотите исправить свою команду sed, обязательно используйте шаблон, совместимый с POSIX BRE, и заполнитель \1 в RHS:

sed -e 's/.*"id":\([0-9][0-9]*\).*/\1/'

POI:

  • Группы захвата определены с помощью \(...\)
  • Одна или несколько цифр совпадают с [0-9][0-9]*

Другие вопросы по теме