KornShell 모드는 반복 지정자(예: , )와 많은 멋진 기능 간의 부정을 사용하여 POSIX 쉘 "glob" 모드(예: *
, 등)를 확장합니다.?
*(...)
+(...)
호비스트 프로젝트에서는 BRE, ERE, JavaScript RegExp와 같은 다양한 정규식 변형 대신 문자열 처리를 위해 이러한 패턴을 구현할 계획입니다. 내 생각에 가장 큰 이점은 패턴을 작성할 때 백슬래시 문자 사용을 피할 수 있기 때문에 C 문자열에서 덜 장황하다는 것입니다.
컴퓨터 과학에 대한 나의 제한된 이해는 KornShell 모드가 기존 구문 규칙을 따르도록 만드는 기능을 지원한다는 것을 암시합니다.
질문: 이것이 기술적으로 올바른가요? (그렇지 않더라도 나는 여전히 이 하위언어가 가치 있고 바람직하다고 생각한다.)
답변1
예, 맞습니다. 일반 확장 정규 표현식을 보다 직접적으로 변환하는 zsh의 확장 glob glob 패턴과 마찬가지로 정규 표현식으로 자격을 얻을 수 있습니다.
오히려 | 다루기 힘든 | 크쉬 93 |
---|---|---|
. |
? |
? |
x* |
x# |
*(x) |
x+ |
x## |
+(x) |
x{1,2} |
x(#c1,2) |
{1,2}(x) |
[...] |
[...] |
[...] |
(...) |
(...) |
@(...) |
a|b |
(a|b) |
@(a|b) |
^ |
(#s) |
없음 1 |
$ |
(#e) |
없음 1 |
x? |
(|x) |
?(x) |
\1 ² |
없음² | \1 |
ksh93의 내장 함수는 printf
정규식을 한 방언에서 다른 방언으로 변환할 수도 있습니다.
$ printf '%P\n' '^(x{1,3})?a+'
?({1,3}(x))+(a)*
$ printf '%R\n' '*(x)'
^(x)*$
ast-open 구현에는 일치를 위해 ksh93 확장 glob 패턴을 사용하는 / grep
가 있습니다 .-K
--ksh-regexp
하지만 난 그래도 전화하는 걸 피하겠어정규식혼란만 야기할 수 있기 때문입니다.
1 glob 패턴은 일반적으로 기본적으로 고정되어 있지만 일부 컨텍스트에서는 일부 외부 구문을 통해 고정될 수 있습니다(예: ${var/#pattern/replacement}
처음에 고정된 패턴과 유사).${var/pattern/replacement}
² 표준 ERE에는 역참조가 없으며 일부 ERE 엔진은 이를 확장으로 지원하지만 표준 BRE에만 있습니다. 어쨌든 zsh와 ksh93은 모두 지원합니다.포착부분을 일치시키고 나중에 다시 호출합니다( 컨텍스트에 따라 $MATCH
zsh에서 / $match[1]
활성화 또는 ksh93에서 / (정확한 일치) / 사용 가능).(#m)
(#b)
\0
${.sh.match[0]}
sed
&
\1
${.sh.match[1]}