source

문자열이 Bash 스크립트의 정규식과 일치하는지 확인

ittop 2023. 5. 2. 22:55
반응형

문자열이 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      |
#      start of line         or 10,11,12         or 10..29      |
#                                                or 30, 31      |
#                                                          end of line

즉, 원하는 형식과 일치하는 정규식을 Bash로 정의할 수 있습니다.이러한 방법으로 다음을 수행할 수 있습니다.

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

여기서 명령어 뒤에&&테스트가 성공적인 경우 실행되고 다음 명령이 실행됩니다.||테스트가 실패할 경우 실행됩니다.

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


다른 셸에서는 grep를 사용할 수 있습니다.셸이 POSIX를 준수하는 경우 다음을 수행합니다.

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

POSIX를 준수하지 않는 물고기에서, 당신은 할 수 있습니다.

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

주의: 이 휴대용 그렙 솔루션은 방수가 되지 않습니다!예를 들어, 새 줄이 포함된 입력 매개 변수에 의해 속을 수 있습니다.첫 번째로 언급된 bash 관련 정규식 검사에는 이 문제가 없습니다.

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') ] 

의 다른 답변 외에도=~Bash 연산자 - ERE(확장 정규식)입니다.

이 구문은 에서 사용됩니다.awk그리고.egrep(또는)grep -E),
바시의 경우 뿐만 아니라[[ ... =~ ... ]]교환입니다.

예를 들어, 다중 인수로 제공되는 다중 테스트를 지원하는 함수는 다음과 같습니다.

#!/bin/bash

#-----------#
# Functions #
#-----------#

function RT
{
    declare __line;

    for __line in "${@:2}";
    do
        if ! [[ "$__line" =~ $1 ]];
        then
            return 1;
        fi
    done

    return 0;
}

#-----------#
# Main      #
#-----------#

regex_v='^[0-9]*$';
value_1_v='12345';
value_2_v='67890';

if RT "$regex_v" "$value_1_v" "$value_2_v";
then
    printf 'Valid';
else
    printf 'Invalid';
fi

묘사

기능.RT또는Regex Test

# Declare a local variable for a loop.

declare __line;
# Loop for every argument's value except the first - regex rule

for __line in "${@:2}";
# Test the value and return a **non-zero** return code if failed.
# Alternative: if [[ ! "$__line" =~ $1 ]];

if ! [[ "$__line" =~ $1 ]];
# Return a **zero** return code - success.

return 0;

주코드

# Define arguments for the function to test

regex_v='^[0-9]*$'; # Regex rule
value_1_v='12345'; # First value
value_2_v='67890'; # Second value
# A statement which runs the function with specified arguments
# and executes `printf 'Valid';` if succeeded, else - `printf 'Invalid';`

if RT "$regex_v" "$value_v";

예를 들어 루프에 카운터를 추가하고 값을 인쇄하여 실패한 인수를 가리킬 수 있어야 합니다.stderr.

관련된

오른쪽에 있는 인용문은=~연산자를 사용하면 정규식이 아닌 문자열이 됩니다.

원천

정규식을 사용하면 날짜의 문자 순서가 올바른지 여부를 확인하는 데 도움이 될 수 있는 경우에는 날짜가 유효한지 여부를 쉽게 확인할 수 없습니다.다음 예제는 정규식을 통과하지만 모두 잘못된 날짜입니다. 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

언급URL : https://stackoverflow.com/questions/21112707/check-if-a-string-matches-a-regex-in-bash-script

반응형