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

Я пытаюсь написать обработчик prepare-commit-msg для git. Сценарий должен выполнить следующие шаги:

  1. Получить текущее имя ветки git (работает)
  2. Извлечь issue-id (не работает)
  3. Проверьте, если issue-id уже в сообщении коммита
  4. Если нет, вставьте [issue-id] перед сообщением фиксации

issue-id имеет этот шаблон [a-zA-Z]+-\d+ и название ветки должно быть что-то вроде feature/issue-id-my-small-description,

Но сейчас часть извлечения не в порядке...

Вот мой сценарий prepare-commit-msg:

# Regex used to extract the issue id
REGEX_ISSUE_ID="s/([a-zA-Z]+-\d+)//"

# Find current branch name
BRANCH_NAME=$(git symbolic-ref --short HEAD)

# Extract issue id from branch name
ISSUE_ID= $BRANCH_NAME | sed -r $REGEX_ISSUE_ID

# Check if the issue id is already in the msg
ISSUE_IN_COMMIT=$(grep -c "\[$ISSUE_ID\]" $1)

# Check if branch name is not null and if the issue id is already in the commit msg
if [ -n "$BRANCH_NAME" ] && ! [[ $ISSUE_IN_COMMIT -ge 1 ]]; then 
  # Prefix with the issue id surrounded with brackets
  sed -i.bak -e "1s/^/[$ISSUE_ID] /" $1
fi

Изменить, чтобы добавить пример ввода / вывода

вход $1 это сообщение git commit, что-то вроде

fix bug on login

или же

fix MyIssue-234 which is a bug on login

Выходные данные должны быть входными данными с идентификатором проблемы, т.е.

[MyIssue-123] fix bug on login

1 ответ

Решение

Я не уверен, что и почему вы делаете, как делаете, но это самое близкое, что я получил, исправляя то, что, как я думал, должно быть исправлено в вашем коде:

# Regex used to extract the issue id
REGEX_ISSUE_ID="s/\[([a-zA-Z]+-[0-9]+)\].*/\1/"

# Find current branch name
BRANCH_NAME=$(git symbolic-ref --short HEAD)
if [[ -z "$BRANCH_NAME" ]]; then
    echo "No brach name... "; exit 1
fi

# Extract issue id from branch name
ISSUE_ID=$(echo "$BRANCH_NAME" | sed -r "$REGEX_ISSUE_ID")

# Check if the issue id is already in the msg
ISSUE_IN_COMMIT=$(echo "$@" | grep -c "^\[*$ISSUE_ID\]*")

# Check if branch name is not null and if the issue id is already in the commit msg
if [[ -n "$BRANCH_NAME" ]]; then
    if [[ $ISSUE_IN_COMMIT -gt 0 ]]; then 
        shift # Drop the issue if from the msg
    fi
    # Prefix with the issue id surrounded with brackets
    MESSAGE="[$ISSUE_ID] $@"
fi

echo "$MESSAGE"

где $@ это все слова, которые вы предоставляете после "исправить" (напр. "$@" = "bug" "on" "login"). Остальное, надеюсь, вы поймете после того, как сравните его с исходным кодом.

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