여기와 비슷한 문자열이 있고 ../../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
.
내 추측으로는 ?
중괄호와 유사하게 이 또한 이스케이프 처리해야 한다는 것입니다. 시도해 보았지만 효과가 있었지만 이유는 모르겠습니다.
그래서 질문은 왜 정규 표현식이 [0-9]?
일치하지 않는지 또는 왜 이스케이프하고 중괄호를 사용해야 하는가입니다.1
sdd1
?
답변1
기본적으로 sed
BRE가 사용되며, ERE는 필수 -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