저는 "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를 사용할 수도 있습니다 .