
나는 비슷한 문자열을 가지고 있으며 여기에서 ../../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]?
일치하지 않는지 , 또는 왜 및 중괄호를 이스케이프해야 하는가 입니다.1
sdd1
?
답변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