변수 "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