이 매개변수 확장이 포함된 zsh 스크립트를 발견했습니다.
${LBUFFER%%(#m)[_a-zA-Z0-9]#}
이 표현이 발견된 맥락을 궁금해하는 사람이라면 누구나 알 수 있습니다.vim과 유사한 약어를 제공하는 zle 위젯 기능
기본 형태는 분명히 접미사 가지치기입니다. 즉${name%%pattern}
즉, from man zshexpn
- 매개변수 확장
${name%pattern} ${name%%pattern} If the pattern matches the end of the value of name, then sub‐ stitute the value of name with the matched portion deleted; [...]
~에 대한매개변수 확장 플래그 (#m)
: 에서man zshexpn
# Evaluate the resulting words as numeric expressions and output the characters corresponding to the resulting integer. Note that this form is entirely distinct from use of the # without parentheses. m Only useful together with one of the flags l or r or with the # length operator when the MULTIBYTE option is in effect. Use the character width reported by the system in calculating how much of the string it occupies or the overall length of the string. Most printable characters have a width of one unit, however cer‐ tain Asian character sets and certain special effects use wider characters; combining characters have zero width. Non-printable characters are arbitrarily counted as zero width; how they would actually be displayed will vary.
이 [_a-zA-Z0-9]#
부분은 분명히 문자열 끝에서 제거하는 패턴인데 LBUFFER
정규식 패턴인가요, 아니면 일종의 정규식 글로빙 믹스인가요?
zsh 관련 "extended_glob" 모드의 일부입니까? , 즉, 에서man zshoptions
EXTENDED_GLOB Treat the `#', `~' and `^' characters as part of patterns for filename generation, etc. (An initial unquoted `~' always pro‐ duces named directory expansion.)
이 zsh 매개변수 확장은 무엇을 합니까?
답변1
이는 zsh "확장 glob" 표현인 것 같습니다.
즉, 에서man zshexpn
와일드카드 플래그
포함하는 그룹의 끝까지 또는 패턴의 끝까지 오른쪽의 모든 텍스트에 영향을 미치는 여러 플래그가 있으며 EXTENDED_GLOB 옵션이 필요합니다. 모두 (#X) 형식을 취합니다. 여기서 X는 다음 형식 중 하나를 취할 수 있습니다.[...]
m은
전체 일치 문자열에 대한 일치 데이터에 대한 참조를 설정합니다. 이는 역참조와 유사하며 파일 이름 생성에는 영향을 미치지 않습니다. 플래그는 패턴 끝에서 유효해야 합니다. 즉, 그룹에 로컬이 아니어야 합니다. $MATCH, $MBEGIN 및 $MEND 매개변수는 각각 일치하는 문자열과 문자열의 시작 및 끝 인덱스로 설정됩니다. 이는 일치하는 문자열이 다른 경우에는 분명한 매개변수 대체에 가장 유용합니다.예를 들어,
arr=(veldt jynx grimps waqf zho buck) print ${arr//(#m)[aeiou]/${(U)MATCH}}
모든 일치 항목(즉, 모든 모음)을 대문자로 강제 설정하여 "vEldt jynx grImps wAqf zhO bUck"를 인쇄합니다. 역참조와 달리 표시된 예와 같은 경우 문자열을 대체하는 데 필요한 추가 대체를 제외하고 일치 참조를 사용하면 속도 저하가 없습니다.
이 #
연산자는 소위 "클로저" 또는 반복 일치 연산자이며 *
정규식 과 동일합니다.
여기에 설명된 대로http://zsh.sourceforge.net/Guide/zshguide05.html#l139
따라서 기본적으로 이 매개변수 확장은 다음과 같습니다.
${LBUFFER%%(#m)[_a-zA-Z0-9]#}
(#m)
정규식 스타일 역참조는 변수(예: BRE 또는 PCRE)에서 일치하는 패턴을 사용할 수 있는 위치에서 시작됩니다 . like는 문자 세트에서 0개 이상의 문자와 일치하기 때문입니다.$MATCH
\1
$1
#
*
[_a-zA-Z0-9]#
[_a-zA-Z0-9]