인덱스에서 문자열을 잘라내어 01-12 범위에 있는지 확인하세요. 이것을 쉘에서 어떻게 구현합니까?

인덱스에서 문자열을 잘라내어 01-12 범위에 있는지 확인하세요. 이것을 쉘에서 어떻게 구현합니까?

문자열이 있습니다.

bDate = 20221201

5-6의 문자가 01에서 12 범위에 있는지 확인하고 싶습니다. 이 예에서는 12와 일치해야 합니다. 20221309의 경우 5~6의 문자가 01~12의 범위에 속하지 않는다고 해야 할까요? 나는 쉘에 컷을 사용하고 있습니다.

답변1

GNU 사용 awk:

printf '%s\n' 20221201 | awk '
    {match($0, /^[0-9]{4}([0-9]{2})[0-9]{2}/, a)
    if (a[1] > 0 && a[1] <= 12) {print a[1] " in range"}
    else{print a[1] " not in range"}}'

변수 이름이 문자열의 일부인 경우 제거하십시오. ^

그리고 BSD awk:

printf '%s\n' 20221201 |
    awk '(length($0) != 8 || ! match($0, /^[0-9]{4}[0-9]{2}[0-9]{2}/))
    {print "wrong input"; exit}
    var = substr($0, 5, 2)
    if (var > 0 && var <= 12) {print var " in range"}
    else{print var " not in range"}}'

그리고:

printf '%s\n' 20221201 |
    perl -nE 'my $m = $1 if /^\d{4}(\d{2})\d{2}/;
    if ($m > 0 && $m <= 12) { say "$m in range" } else {say "$m not in range"}'

유천:

bDate=20221201
[[ $bDate =~ ^[0-9]{4}([0-9]{2})[0-9]{2} ]] || { echo "wrong input"; exit; }
if ((${BASH_REMATCH[1]} > 0 && ${BASH_REMATCH[1]} <=12)); then
    echo "${BASH_REMATCH[1]} in range"
else
    echo "${BASH_REMATCH[1]} not in range"
fi

관련 정보