Bash는 reg 표현식을 한 번 이상 확인합니다.

Bash는 reg 표현식을 한 번 이상 확인합니다.

변수 "X"가 다음 패턴에 있는지 확인하고 싶습니다 [a-zA-Z0-9]+:[0-9]+:[0-9]+. 다음 명령으로 확인합니다.if [[ "${X}" =~ [a-zA-Z0-9]+:[0-9]+:[0-9]+ ]]

이제 패턴을 여러 개에 삽입할 수 있는 옵션을 추가하고 싶습니다. 이 경우 ,. 나는 비슷한 일을 할 수 있다고 생각했습니다 [a-zA-Z0-9]+:[0-9]+:[0-9]+[,[a-zA-Z0-9]+:[0-9]+:[0-9]+]*. 내 질문은 더 짧게 만들 수 있습니까?

답변1

^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$섹션에 대괄호 대신 괄호를 사용 하고 패턴을 문자열의 시작과 끝으로 고정 해야 합니다 (,...)*(그렇지 않으면 문자열의 일부와 일치하는 데 충분합니다).

한 가지 옵션은 정규식을 유지하면서 반복되는 부분을 변수에 저장하는 것입니다.

p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes

또는 앞에 쉼표를 추가하세요., RE를 다음으로 변경하세요 (,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+.

q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes

그러나 스크립트의 목록에 있는 값을 처리하는 경우 조만간 이를 여러 부분으로 분할해야 하므로 각 부분을 개별적으로 분할하고 테스트하는 것으로 시작할 수 있습니다.

s='adsf,bar:56:78'
p='^[a-zA-Z0-9]+:[0-9]+:[0-9]+$'
IFS=, read -a a <<< "$s"
for x in "${a[@]}"; do 
    if [[ $x =~ $p ]]; then 
        echo "$x is ok";
    else 
        echo "$x is not ok"; 
    fi
done

관련 정보