Как отладить (PCRE) регулярное выражение, переданное в grep? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь отладить регулярное выражение, переданное grep, которое, похоже, не работает только в моей системе.

Это полная команда, которая должна возвращать последнюю версию выпуска terraform:

wget -qO - "https://api.github.com/repos/hashicorp/terraform/releases/latest" | grep -Po '"tag_name": "v\K.*?(?=")'

Что, кажется, работает для других, но не для меня. Добавление квантификатора * после "tag_name": для соответствия лишним пробелам заставляет меня работать:

wget -qO - "https://api.github.com/repos/hashicorp/terraform/releases/latest" | grep -Po '"tag_name": *"v\K.*?(?=")'

Вот ответ от wget без конвейера на grep:

{
  "url": "https://api.github.com/repos/hashicorp/terraform/releases/20814583",
  "assets_url": "https://api.github.com/repos/hashicorp/terraform/releases/20814583/assets",
  "upload_url": "https://uploads.github.com/repos/hashicorp/terraform/releases/20814583/assets{?name,label}",
  "html_url": "https://github.com/hashicorp/terraform/releases/tag/v0.12.12",
  "id": 20814583,
  "node_id": "MDc6UmVsZWFzZTIwODE0NTgz",
  "tag_name": "v0.12.12",
  "target_commitish": "master",
  "name": "",
  "draft": false,
  "author": {
    "login": "apparentlymart",
    "id": 20180,
    "node_id": "MDQ6VXNlcjIwMTgw",
    "avatar_url": "https://avatars1.githubusercontent.com/u/20180?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/apparentlymart",
    "html_url": "https://github.com/apparentlymart",
    "followers_url": "https://api.github.com/users/apparentlymart/followers",
    "following_url": "https://api.github.com/users/apparentlymart/following{/other_user}",
    "gists_url": "https://api.github.com/users/apparentlymart/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/apparentlymart/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/apparentlymart/subscriptions",
    "organizations_url": "https://api.github.com/users/apparentlymart/orgs",
    "repos_url": "https://api.github.com/users/apparentlymart/repos",
    "events_url": "https://api.github.com/users/apparentlymart/events{/privacy}",
    "received_events_url": "https://api.github.com/users/apparentlymart/received_events",
    "type": "User",
    "site_admin": false
  },
  "prerelease": false,
  "created_at": "2019-10-18T18:39:16Z",
  "published_at": "2019-10-18T18:45:33Z",
  "assets": [],
  "tarball_url": "https://api.github.com/repos/hashicorp/terraform/tarball/v0.12.12",
  "zipball_url": "https://api.github.com/repos/hashicorp/terraform/zipball/v0.12.12",
  "body": "BUG FIXES:\r\n\r\n* backend/remote: Don't do local validation of whether variables are set prior to submitting, because only the remote system knows the full set of configured stored variables and environment variables that might contribute. This avoids erroneous error messages about unset required variables for remote runs when those variables will be set by stored variables in the remote workspace. ([#23122](https://github.com/hashicorp/terraform/issues/23122))"
}

И используя https://regex101.com, я вижу, что "tag_name": "v\K.*?(?=") и "tag_name": *"v\K.*?(?=") оба соответствуют номеру версии правильно.

Так что, должно быть, что-то не так с моей системой, и я просто оченьЛюбопытно, почему оригинальный вариант не работает для меня и как (если это возможно) отлаживать в подобных ситуациях.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Я смог сузить это до следующего. Если я выполню команду wget без переданного grep и без форматирования ответа json:

wget -qO - "https://api.github.com/repos/hashicorp/terraform/releases/latest"

, то получу json без пробелов (я опубликую только одну часть ответа):

"html_url":"https://github.com/hashicorp/terraform/releases/tag/v0.12.12","id":20814583,"node_id":"MDc6UmVsZWFzZTIwODE0NTgz","tag_name":"v0.12.12","target_commitish":"master","name":"","draft":false

Таким образом, исходное регулярное выражение "tag_name": "v\K.*?(?=") завершается неудачно, поскольку после :

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

0 голосов
/ 31 октября 2019

Весьма вероятно, что ваш движок RegExp не понимает \ K. Существует много диалектов регулярных выражений.

Использование стандартных терминов регулярных выражений PCRE обычно дает хорошие результаты для всех механизмов.

$ curl -s "https://api.github.com/repos/hashicorp/terraform/releases/latest" | egrep -oe '"tag_name": "v(.*)"'
"tag_name": "v0.12.12"

Теперь, если вам нужен только номер версии, вам нужно получить длячисла после (как использование?! для игнорирования шаблона может не всегда работать).

curl -s "https://api.github.com/repos/hashicorp/terraform/releases/latest" | egrep -oe '"tag_name": "v(.*)"' | egrep -oe '([0-9]+\.?)+'
0.12.12
...