여러 줄 정규식이 작동하지 않습니다.

여러 줄 정규식이 작동하지 않습니다.

커밋 메시지가 특정 스타일 가이드를 준수하는지 확인하는 프로젝트 commit-msg용 후크를 작성 하려고 합니다 . git그러나 정규식의 경우 다르게 작동하는 것이 있는 것 같습니다 bash. 내 목표를 어떻게 달성할 수 있나요?

#!/usr/bin/env bash

read -r -d '' pattern << EOM
(?x)                                      # Enable comments and whitespace insensitivity.
^                                         # Starting from the very beginning of the message
(feat|fix|docs|style|refactor|test|chore) # should be a type which might be one of the listed,
:[ ]                                      # the type should be followed by a colon and whitespace,
(.{1,50})\n                               # then goes a subject that is allowed to be 50 chars long at most,
(?:\n((?:.{0,80}\n)+))?                   # then after an empty line goes optional body each line of which
                                          # may not exceed 80 characters length.
$                                         # The body is considered everything until the end of the message.
EOM

message=$(cat "${1}")

if [[ ${message} =~ ${pattern} ]]; then
  exit 0
else
  error=$(tput setaf 1)
  normal=$(tput sgr0)
  echo "${error}The commit message does not accord with the style guide that is used on the project.${normal}"
  echo "For more details see https://udacity.github.io/git-styleguide/"
  exit 1
fi

나는 또한 이 정규식을 다음과 같이 온라인으로 작성해 보았습니다.

pattern="^(feat|fix|docs|style|refactor|test|chore):[ ](.{1,50})\n(?:\n((?:.{0,80}\n)+))?$"

\n교체 를 시도했지만 $'\n'도움이되지 않았습니다.

답변1

Bash는 POSIX 확장 정규식(ERE)을 지원하지만 Perl 호환 정규식(PCRE)은 지원하지 않습니다. 특히 (?x)(?:...)PCRE입니다.

(?:...)로 바꾸면 한 줄 버전을 간략하게 살펴 볼 수 있습니다 (...). Perl x수정자가 제공하는 "공백 무시" 기능은 확장 정규식에서는 사용할 수 없습니다.

또한보십시오:내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

관련 정보