이 zsh 매개변수 확장은 어떻게 작동합니까?

이 zsh 매개변수 확장은 어떻게 작동합니까?

이 매개변수 확장이 포함된 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]

관련 정보