왜 '?'는 그렇지 않습니까? 정규식 문자가 sed에서 일치하는 항목을 생성합니까?

왜 '?'는 그렇지 않습니까? 정규식 문자가 sed에서 일치하는 항목을 생성합니까?

나는 비슷한 문자열을 가지고 있으며 여기에서 ../../sdd1일치시키려고 합니다 . sdd다음 명령을 사용하려고 합니다 sed.

echo "../../sdd1" | sed 's:.*\([a-z]\{3\}\)[0-9]?:\1:' 

일치 항목이 생성되지 않습니다.
하지만 내가 사용할 때

echo "../../sdd1" | sed 's:.*\([a-z]\{3\}\)[0-9]\{0,1\}:\1:'

그런 다음 일치하는 항목을 얻습니다 sdd.

내 추측으로는 ?중괄호와 유사하게 이스케이프해야 한다는 것입니다. 시도했지만 작동하지만 이유는 모르겠습니다.

그렇다면 질문은 왜 정규식이 from 과 [0-9]?일치하지 않는지 , 또는 왜 및 중괄호를 이스케이프해야 하는가 입니다.1sdd1?

답변1

기본적으로 BRE를 사용하며 ERE를 사용하려면 sed필요 -E하거나 옵션이 있습니다.-r

에서 인용GNU sed 매뉴얼

GNU sed에서 기본 정규식과 확장 정규식의 유일한 차이점은 '?', '+', 괄호, 중괄호('{}') 및 '|'와 같은 몇 가지 특수 문자의 동작입니다.

기본(BRE) 구문에서 이러한 문자는 앞에 백슬래시('\')가 붙지 않는 한 특별한 의미가 없습니다. 확장(ERE) 구문에서는 그 반대입니다. 이러한 문자는 앞에 백슬래시('\')가 붙지 않는 한 특수합니다.

그래서, 에 대해 GNU sed사용하세요

$ echo '../../sdd1' | sed 's:.*\([a-z]\{3\}\)[0-9]\?:\1:'
sdd
$ echo '../../sdd1' | sed -E 's:.*([a-z]{3})[0-9]?:\1:'
sdd

~을 위한POSIX BRE, 두 번째 명령은 갈 길입니다

$ echo '../../sdd1' | sed 's:.*\([a-z]\{3\}\)[0-9]\{0,1\}:\1:'
sdd

관련 정보