Невозможно извлечь определенное значение файла json, используя sed в сценарии оболочки - PullRequest
0 голосов
/ 19 мая 2019

Я использую команду sed для извлечения значения, которое я получаю из вывода после выполнения curl.Ниже приведен мой сценарий оболочки.

#!/bin/bash
release=$(curl -H "Authorization:token xxxxxxxxxxxxxxxxxxxxxx" -H "Content-Type: application/json" https://api.github.com/repos/octocat/Hello-World/releases/tags/v1.0.0)
id=$(echo "$release" |sed -n -e 's/"id":\\ \\([0-9]\\+\\),/\\1/p' | head -n 1 | sed 's/[[:blank:]]//g')
echo $id

Вывод, который я получил после curl, - это файл json.Ниже приведен вывод

{
 "url": "https://api.github.com/repos/octocat/Hello-World/releases/1",
  "html_url": "https://github.com/octocat/Hello-World/releases/v1.0.0",
  "assets_url": "https://api.github.com/repos/octocat/Hello- 
   World/releases/1/assets",
   "upload_url": "https://uploads.github.com/repos/octocat/Hello- 
  World/releases/1/assets{?name,label}",
  "tarball_url": "https://api.github.com/repos/octocat/Hello- 
  World/tarball/v1.0.0",
  "zipball_url": "https://api.github.com/repos/octocat/Hello- 
 World/zipball/v1.0.0",
 "id": 1234332,
  "node_id": "MDc6UmVsZWFzZTE=",
  "tag_name": "v1.0.0",
  "target_commitish": "master",
  "name": "v1.0.0",
  "body": "Description of the release",
  "draft": false,
  "prerelease": false,
  "created_at": "2013-02-27T19:35:32Z",
  "published_at": "2013-02-27T19:35:32Z",
  "author": {
   "login": "octocat",
   "id": 1353322,
   "node_id": "MDQ6VXNlcjE=",
   "avatar_url": "https://github.com/images/error/octocat_happy.gif",
   "gravatar_id": "",
   "url": "https://api.github.com/users/octocat",
   "html_url": "https://github.com/octocat",
   "followers_url": "https://api.github.com/users/octocat/followers",
   "following_url": 
   "https://api.github.com/users/octocat/following{/other_user}",
   "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
   "starred_url": "https://api.github.com/users/octocat/starred{/owner} 
   {/repo}",
   "subscriptions_url": 
   "https://api.github.com/users/octocat/subscriptions",
   "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
     "received_events_url": 
   "https://api.github.com/users/octocat/received_events",
   "type": "User",
   "site_admin": false
   },
  "assets": [
   {
   "url": "https://api.github.com/repos/octocat/Hello- 
   World/releases/assets/1",
  "browser_download_url": "https://github.com/octocat/Hello- 
  World/releases/download/v1.0.0/example.zip",
   "id": 56432211,
   "node_id": "MDEyOlJlbGVhc2VBc3NldDE=",
   "name": "example.zip",
   "label": "short description",
   "state": "uploaded",
   "content_type": "application/zip",
   "size": 1024,
   "download_count": 42,
   "created_at": "2013-02-27T19:35:32Z",
   "updated_at": "2013-02-27T19:35:32Z",
   "uploader": {
     "login": "octocat",
     "id": 5663322,
     "node_id": "MDQ6VXNlcjE=",
     "avatar_url": "https://github.com/images/error/octocat_happy.gif",
     "gravatar_id": "",
     "url": "https://api.github.com/users/octocat",
     "html_url": "https://github.com/octocat",
     "followers_url": "https://api.github.com/users/octocat/followers",
     "following_url": 
     "https://api.github.com/users/octocat/following{/other_user}",
     "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
     "starred_url": "https://api.github.com/users/octocat/starred{/owner} 
    {/repo}",
     "subscriptions_url": 
     "https://api.github.com/users/octocat/subscriptions",
     "organizations_url": "https://api.github.com/users/octocat/orgs",
     "repos_url": "https://api.github.com/users/octocat/repos",
     "events_url": 
     "https://api.github.com/users/octocat/events{/privacy}",
     "received_events_url": 
     "https://api.github.com/users/octocat/received_events",
     "type": "User",
     "site_admin": false
   }
 }
 ]
}

Команда sed, которую я разместил выше, должна работать так же, как и для других команд curl.

Имеется несколько значений id, но я хочу, чтобы значение первой ID было сохранено в переменной id, которая "id": 1234332

Но в качестве выводаЯ ничего не получаю.

Нужна помощь в этом.

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Я исправил команду sed, и она сработала.

Двойная обратная косая черта \\, где экранируется команда, поэтому я изменил ее на одиночную обратную косую черту \ Ниже приведен модифицированный скрипт оболочки.

release=$(curl -H "Authorization:token xxxxxxxxxxxxxxxxxxxxxx" -H "Content-Type: application/json" https://api.github.com/repos/octocat/Hello-World/releases/tags/v1.0.0)
id=$(echo "$release" | sed -n -e 's/"id":\ \([0-9]\+\),/\1/p' | head -n 1 | sed 's/[[:blank:]]//g')
echo $id
1 голос
/ 19 мая 2019
  1. Не используйте двойные кавычки вместо одиночных, если только вы не хотите, чтобы что-то в строке в кавычках было расширено,
  2. Используйте для анализа значений JSON, sed - это инструмент, ориентированный на строки, и не может анализировать синтаксис JSON.

например:

id=$(curl -H 'Authorization:token xxxxxxxxxxxxxxxxxxxxxx' -H 'Content-Type: application/json' 'https://api.github.com/repos/octocat/Hello-World/releases/tags/v1.0.0' |
  jq -r '.id')
echo "$id"
0 голосов
/ 19 мая 2019

Двойная обратная косая черта совпадает с буквальной обратной косой чертой, поэтому ваш код не работает.

Вы можете попробовать этот grep:

id=$(grep -o -m 1 '"id": [0-9]\{1,\},' <<< "$release" | sed 's/"id": //' | sed 's/,//')

-m 1 получит только первое вхождение (отметьте Grep только первое совпадение и остановите ), -o получит текст соответствия регулярному выражению - "id": + 1 или более цифр и запятую и sed 's/"id": //' | sed 's/,//' удалит "id": и запятую из возвращаемого текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...