Bash if 문의 정규식 일치
내가 여기서 뭘 잘못했나요?
공백, 소문자, 대문자 또는 숫자가 포함된 문자열과 일치하려고 합니다.특수 캐릭터도 좋지만, 특정 캐릭터의 탈출이 필요할 것 같아요.
TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#"
if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi
이것은 분명히 상위, 하위, 숫자 및 공백만 테스트합니다.그래도 잘 안 되네.
* 갱신 *
좀 더 구체적으로 말할 걸 그랬나 봐요여기 실제 코드 행이 있습니다.
if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; fi
* 갱신 *
./anm.sh: line 265: syntax error in conditional expression
./anm.sh: line 265: syntax error near `&*#]'
./anm.sh: line 265: ` if [[ ! "$TITLE" =~ [a-zA-Z0-9 $%^\&*#] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; return; fi'
Bash's에 대해 알아야 할 몇 가지 중요한 것이 있습니다.[[ ]]
구축.첫 번째:
단어 분할과 경로명 확장은 두 단어 사이의 단어에 대해 수행되지 않습니다.
[[
그리고.]]
; 칠드 확장, 파라미터 및 변수 확장, 산술 확장, 명령어 대체, 프로세스 대체 및 견적 삭제가 수행됩니다.
두 번째는
추가 이진 연산자 '=~'을 사용할 수 있습니다.연산자 오른쪽에 있는 문자열은 확장된 정규 표현으로 간주되며 그에 따라 일치합니다.패턴의 임의의 부분을 따옴표로 묶어서 문자열로 일치시킬 수 있습니다.
그 결과,$v
의 양쪽에=~
해당 변수 값까지 확장되지만 결과는 word-module 또는 pathname-model이 되지 않습니다.즉, 변수 확장은 따옴표로 묶지 않고 왼쪽에 두는 것이 안전하지만 변수 확장은 오른쪽에서 발생한다는 것을 알아야 합니다.
다음과 같이 적습니다.[[ $x =~ [$0-9a-zA-Z] ]]
,그$0
오른쪽의 regex 내의 regex는 regex가 해석되기 전에 확장됩니다.이것은 아마 regex의 컴파일에 실패하는 원인이 될 것입니다(확장이 아닌 한).$0
는 ASCII 값이 숫자보다 작은 숫자 또는 구두점 기호로 끝납니다).오른쪽을 so와 같이 따옴표로 묶으면 오른쪽은 정규식이 아닌 일반 문자열로 취급됩니다.$0
계속 확장됩니다).이 경우에 당신이 정말로 원하는 것은[[ $x =~ [\$0-9a-zA-Z] ]]
마찬가지로, 의 표현은[[
그리고.]]
정규식이 해석되기 전에 단어로 분할됩니다.따라서 정규식 공백은 이스케이프 또는 따옴표로 묶어야 합니다.문자, 숫자 또는 공백을 일치시키는 경우:[[ $x =~ [0-9a-zA-Z\ ] ]]
#
따옴표를 붙이지 않으면 코멘트가 시작됩니다.을 사용하다
pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
bash의 렉서를 통과하기 위해 이스케이프 또는 따옴표가 필요한 많은 문자를 포함하는 정규식에서는 많은 사람들이 이 스타일을 선호합니다.단, 주의:이 경우 변수 확장을 따옴표로 묶을 수 없습니다.
# This doesn't work:
if [[ $x =~ "$pat" ]]; then ...
마지막으로 변수에 유효한 문자만 포함되어 있는지 확인하려고 합니다.이 검사를 수행하는 가장 쉬운 방법은 잘못된 문자가 포함되어 있지 않은지 확인하는 것입니다.즉, 다음과 같은 표현입니다.
valid='0-9a-zA-Z $%&#' # add almost whatever else you want to allow to the list
if [[ ! $x =~ [^$valid] ]]; then ...
!
하여 " match하고 "does match"는 "does match"로 변환합니다.[^...]
는 'regex가 아닌 다른 를...
"
파라미터 확장과 regex 연산자의 조합으로 bash 정규식 구문을 "거의 읽을 수 있다"고 할 수 있지만, 아직 gotcha가 있습니다.(항상 있지 않습니까?) 번째는 ' 하다'를 못 요.]
$valid
, 「 「」의 $valid
(Posix regex를 포함시키고 ) : (Posix regex를 시키는 )]
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -
과 수 에 둘 다 ]
★★★★★★★★★★★★★★★★★」-
, 이랬을 때 , 이랬으면 ]
으로 with으 and and and and and로 -
내가 이모티콘으로 .[][-]
)
누군가 변수를 이용한 예를 원했다면...
#!/bin/bash
# Only continue for 'develop' or 'release/*' branches
BRANCH_REGEX="^(develop$|release//*)"
if [[ $BRANCH =~ $BRANCH_REGEX ]];
then
echo "BRANCH '$BRANCH' matches BRANCH_REGEX '$BRANCH_REGEX'"
else
echo "BRANCH '$BRANCH' DOES NOT MATCH BRANCH_REGEX '$BRANCH_REGEX'"
fi
사사 i i i i i i를 하고 싶다[:punct:]
그럴 수 있어요.ㅇㅇㅇㅇ.a-zA-Z09-9
있다[:alnum:]
:
[[ $TEST =~ ^[[:alnum:][:blank:][:punct:]]+$ ]]
아니면 저처럼 엉뚱한 오타를 내서 =~가 ~=로 바뀌었기 때문에 이 질문을 보고 있을지도 모릅니다.
언급URL : https://stackoverflow.com/questions/18709962/regex-matching-in-a-bash-if-statement
'programing' 카테고리의 다른 글
체리픽을 어떻게 중단하죠? (0) | 2023.04.21 |
---|---|
Add-PSSnapin을 호출하기 전에 PowerShell 스냅인이 이미 로드되었는지 확인하는 방법 (0) | 2023.04.21 |
grep로 한 단어를 제외하려면 어떻게 해야 하나요? (0) | 2023.04.21 |
IIS8의 WCF. *.svc 핸들러 매핑이 작동하지 않음 (0) | 2023.04.21 |
UITableViewCell은 흰색 배경을 표시하며 iOS7에서는 수정할 수 없습니다. (0) | 2023.04.21 |