정규식 '[az][0-9]+$'가 작동하지 않는 이유

정규식 '[az][0-9]+$'가 작동하지 않는 이유

저는 "abc123" 문자열을 처리하기 위해 정규식을 사용하고 있습니다. 다음 명령이 작동 중이며 "c123" 값을 반환합니다.

echo abc123 | grep -o [a-z][0-9]*$

그러나 아래 명령은 작동하지 않습니다.

echo abc123 | grep -o [a-z][0-9]+$

왜 이런 결과가 나오나요?

"*"는 이전 패턴 요소와 0번 이상 일치하는 데 사용되고, "+"는 이전 패턴 요소와 적어도 1번 이상 일치하는 데 사용된다는 것을 알고 있습니다.

그래서 이 상황은 나를 혼란스럽게 한다.

답변1

+그냥 수량자확장하다정규식(ERE):

$ echo abc123 | grep -Eo '[a-z][0-9]+$'
c123

BRE(Basic Regular Expressions)에서는 literals 와 일치 +하지만 이를 사용할 수 있지만 \{1,\}GNU grep( -o어쨌든 이미 GNU 확장임) 에서는 다음과 같습니다 \+.

$ echo abc123 | grep -o '[a-z][0-9]\+$'
c123

( 쉘 [에 의한 해석을 방지하기 위해 따옴표를 참고하십시오 ).\

답변2

+grep을 적용하려면 이스케이프가 필요합니다. 바꾸다

echo abc123 | grep -o [a-z][0-9]+$

당신은 작성해야

echo abc123 | grep -o '[a-z][0-9]\+$'

이스케이프해야 할 다른 문자도 있습니다. 정규식을 작은따옴표로 묶는 것도 좋은 습관입니다.

egrep확장 RE의 동의어를 사용 grep -E하고 @muru가 주석 처리한 대로 확장 RE를 사용할 수도 있습니다 .

관련 정보