문자열이 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
'source' 카테고리의 다른 글
레일: FATAL - 사용자에 대한 피어 인증 실패(PG:: 오류) (0) | 2023.05.02 |
---|---|
Mongoose, CastError: 모델이 포함된 모델을 저장하려고 할 때 값에 대해 배열로 캐스트하지 못했습니다. (0) | 2023.05.02 |
Git for Unity 3D 소스 제어를 사용하는 방법은 무엇입니까? (0) | 2023.05.02 |
Azure 테이블 스토리지 대 CosmosDB 테이블 API (0) | 2023.04.27 |
vba의 셸()을 사용하여 매개 변수로 .exe를 실행하는 방법은 무엇입니까? (0) | 2023.04.27 |