쉼표로 구분된 0개 이상의 키워드와 일치하는 가능성을 원합니다.
나는 다음 정규 표현식을 사용합니다
if [[ "$var" =~ ^([^,]+(,[^,]+)*)*$ ]]; then
echo "KY MATCH"
fi
나는 다음과 일치하고 싶다
var=""
var="keyword"
var="keyword,keyword"
var="keyword,keyword,keyword"
정규식을 단순화하거나 더 명확하게 만들 수 있나요?
답변1
Bash는 POSIX 확장 정규식을 사용합니다. try info bash -n 'Conditional Constructs'
및 man 7 regex
(첫 번째 명령의 경우 설치해야 하고 info
, 두 번째 명령의 경우 man-pages
).
키워드에 문자만 포함된 경우 문자 클래스를 사용 하거나 또는 를 [:alpha:]
사용할 수 있습니다 .[:alnum:]
[:word:]
이 스크립트를 사용해보고 올바른 클래스를 선택하세요.
#!/bin/bash
for var in "" "keyword" "keyword,keyword" "keyword,keyword,keyword"; do
[[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done
for var in "1" "key word" "key123word,keyword" "keyword, keyword ,keyword"; do
[[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done
고쳐 쓰다
댓글에서 말했듯이 내 표현은 여기에 적용되지 않습니다 - keyword,keyword,
. 이 표현이 적절한 것 같습니다 ^([[:alpha:]]+(,[[:alpha:]]+)*)*$
. 어떻게 더 간단하게 만들 수 있을지 모르겠습니다.
답변2
쉼표로 구분된 키워드를 다음과 같이 정규식으로 변환하면 더 쉬울 수 있습니다.
#!/usr/bin/env -S bash -
#keywords="keyword"
#keywords="aaa,bbb,ccc"
keywords="aaa,bbb,ccc,"
#keywords="ddd,"
#keywords=""
var='aaa'
regex="${keywords%,}" # trim trailing ','
regex="${regex//,/\|}" # replace ',' with '|'
printf 'Your var : %s\n' "$var"
printf 'Your regex: %s\n' "$regex"
if [[ $var =~ ^($regex)$ ]]; then
printf '%s\n' '-> it matches'
else
printf '%s\n' '-> it does not match'
fi
이로 인해
$ temp/match-comma-separated-keywords.sh
Your var: aaa
Your regex: aaa|bbb|ccc
-> it matches
답변3
제외하려는 유일한 항목은 ,
필드가 없는 특수한 경우를 제외하고 null로 구분된 필드인 것 같습니다. 따라서 ,
첫 번째나 마지막 또는 두 개의 연속 문자열이 있는 문자열을 제외합니다.
case $string in
(,* | *,,* | *,) echo>&2 not OK;;
(*) echo OK;;
esac
또는
case ,${string:-empty}, in
(*,,*) echo>&2 not OK;;
(*) echo OK;;
esac
이는 표준 POSIX sh 구문이거나 Korn 스타일 구문을 사용합니다.
[[ ,${string:-empty}, != *,,* ]]
. 불필요한 =~
.
정규식은 다음과 같습니다.
[[ $string, =~ ^([^,]+,)*$ ]]
그러나 와일드카드 패턴을 사용하면 시스템의 정규식 엔진 및 그에 따른 문제(예: 비문자로 인한 질식)에 의존하지 않고도 이 작업을 수행할 수 있습니다.
[[ $string, = *(+([^,]),) ]]