#json #bash #parsing #grep
Вопрос:
Как я могу найти пустое имя с помощью grep?
мои файлы json
{
"IDS": [
{
"digest": "sha256:b97"
},
{
"digest": "sha256:d25"
},
{
"digest": "sha256:c40",
"tag": "0"
}
]
}
Я хотел бы использовать grep для поиска файла дайджеста без тега.
я хочу, чтобы мне понравился этот результат.
sha256:b97
sha256:d25
Я использовал «имеет(тег) == false» в jq, но моя природа окружающей среды недоступна с помощью jq
Интересно, как его использовать без jq, python и других инструментов.
Спасибо, что прочитали мой пост. XD
Комментарии:
1. Если вы не используете/не пишете полноценный движок JSON в Bash, вам понадобятся некоторые предположения о том, как записывается файл JSON. Вы на 100% уверены, что файл соответствует точной структуре, как показано выше? Под структурой я имею в виду даже такие вещи, как расположение новых строк и запятых.
2. @vdavid да конечно! 100%, эта структура показана выше. Эта структура представляет собой команду aws ecr list-images.
Ответ №1:
Если о jq не может быть и речи, альтернативой awk может быть:
awk '/"digest"[^,] $/{gsub(/"/,""); print $NF}' input.json
Если входные данные уменьшены:
$ echo $foo
{ "IDS": [ { "digest": "sha256:b97" }, { "digest": "sha256:d25" }, { "digest": "sha256:c40", "tag": "0" } ] }
$
$ awk -vRS='[{}]' 'NF==2 amp;amp; $0 ~ /"digest"/{gsub(/"/,"");print $NF}' <<< "$foo"
sha256:b97
sha256:d25
Комментарии:
1. Правильно, awk-хорошая альтернатива, но команда, похоже, не работает.
2. Тогда, возможно, вы не используете ввод, указанный в вопросе?
3. Нет, я использую этот ввод. json=$(эхо { «ИДЕНТИФИКАТОРЫ»: [ … ] })
4. Это сработает, если вы сохраните ввод как «input.json» и запустите его, как показано выше.
5. греаааааааааттттттттееееее! супер хак XD, спасибо тебе @Thomas Hansen
Ответ №2:
Не используйте для этого регулярное выражение. Используйте синтаксический анализатор JSON:
jq -r '.IDS[] | select(has("tag") | not) | .digest' file.json
Если вам не разрешено использовать правильные инструменты, ваш работодатель не позволит вам выполнять вашу работу.
Комментарии:
1. Я согласен, как вы можете видеть из текста, я раньше использовал jq.