[regex] Bash 스크립트에서 문자열이 정규식과 일치하는지 확인하십시오.

내 스크립트가 수신하는 인수 중 하나는 다음 형식의 날짜입니다 yyyymmdd.

입력으로 유효한 날짜가 있는지 확인하고 싶습니다.

어떻게해야합니까? 정규식을 사용하려고합니다.[0-9]\{\8}



답변

[[ ]]정규 표현식 일치 연산자와 함께 테스트 구문을 사용할 수 있습니다 .=~ 문자열이 정규식 패턴과 일치하는지 확인할 수 있습니다.

구체적인 경우에는 다음과 같이 쓸 수 있습니다.

[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"

또는 더 정확한 테스트 :

[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
#           |^^^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
#           |   |     ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^ |
#           |   |          |                   |              |
#           |   |           \                  |              |
#           | --year--   --month--           --day--          |
#           |          either 01...09      either 01..09     end of line
# start of line            or 10,11,12         or 10..29
#                                              or 30, 31

즉, 원하는 형식과 일치하는 Bash 에서 정규식을 정의 할 수 있습니다 . 이 방법으로 할 수있는 일 :

[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"

&&테스트가 성공하면 이후의 명령 이 실행되고 이후의 명령은|| 테스트가 실패하면 실행됩니다.

이것은 bash의 사용자 입력 날짜 형식 확인에서 Aleks-Daniel Jakimenko의 솔루션을 기반으로합니다 .


다른 쉘에서는 grep 을 사용할 수 있습니다 . 쉘이 POSIX 호환 인 경우

(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"

POSIX 호환이 아닌 fish 에서는 할 수 있습니다

echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"


답변

bash 버전 3에서는 ‘= ~’연산자를 사용할 수 있습니다.

if [[ "$date" =~ ^[0-9]{8}$ ]]; then
    echo "Valid date"
else
    echo "Invalid date"
fi

참조 : http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

참고 : Bash 버전 3.2부터는 이중 대괄호 [[]] 내에서 일치 연산자의 인용 부호가 더 이상 필요하지 않습니다.


답변

문자열이 올바른 날짜인지 테스트하는 좋은 방법은 명령 날짜를 사용하는 것입니다.

if date -d "${DATE}" >/dev/null 2>&1
then
  # do what you need to do with your date
else
  echo "${DATE} incorrect date" >&2
  exit 1
fi

의견에서 : 서식을 사용할 수 있습니다

if [ "2017-01-14" == $(date -d "2017-01-14" '+%Y-%m-%d') ] 


답변

expr match대신에 사용 합니다 =~:

expr match "$date" "[0-9]\{8\}" >/dev/null && echo yes

이것은 빈 문자열과도 일치 =~하므로 =~IMHO는 사용하지 않아야 하기 때문에 현재 사용되는 대답보다 낫습니다 . badvar정의되지 않은 다음 [[ "1234" =~ "$badvar" ]]; echo $?(잘못된) 0expr match "1234" "$badvar" >/dev/null ; echo $?제공하지만 올바른 결과 를 제공 한다고 가정 하십시오 1.

우리는 사용할 필요가 >/dev/null숨기기로 expr match출력 값 일치하는 항목이없는 경우 문자의 수가 일치 또는 0,. 음표 출력값이 상이하다 그 종료 상태 . 일치하는 것이 있으면 종료 상태는 0이고 그렇지 않으면 1입니다.

일반적으로 구문 expr은 다음과 같습니다.

expr match "$string" "$lead"

또는:

expr "$string" : "$lead"

$lead정규식은 어디에 있습니까 ? 그것이 exit status사실이 될 것입니다 (0)의 경우 lead경기의 주요 슬라이스 string(이 이름이 있습니까?). 예를 들어 expr match "abcdefghi" "abc"종료 true하지만 expr match "abcdefghi" "bcd"종료 false합니다. (이 점을 지적한 @Carlo Wood에게 감사드립니다.


답변

정규식을 사용하여 날짜의 문자 순서가 올바른지 확인하는 데 도움이 될 수 있으면 날짜가 유효한지 쉽게 확인할 수 없습니다. 다음 예제는 정규식을 전달하지만 모두 유효하지 않은 날짜입니다. 20180231, 20190229, 20190431

따라서 날짜 문자열 (이라고 부름 datestr)이 올바른 형식 인지 확인하려면 날짜 를 구문 분석 하고 문자열을 올바른 형식으로 변환 date하도록 요청 하는 것이 가장 좋습니다 date. 두 문자열이 모두 같으면 유효한 형식과 유효한 날짜입니다.

if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
     echo "Valid date"
else
     echo "Invalid date"
fi


답변