Как работает это расширение параметров zsh?

Как работает это расширение параметров zsh?

Я наткнулся на скрипт zsh, который содержит это расширение параметра

${LBUFFER%%(#m)[_a-zA-Z0-9]#}

Для тех, кто хочет знать контекст, в котором живет это выражение, это частьФункция виджета zle, которая предоставляет сокращения, похожие на vim

Его основная форма, очевидно, является суффиксом trim. т.е.${name%%pattern}

т.е. из 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 «extended 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]#}

начнет обратную ссылку в стиле regex, начиная с (#m)которой любой сопоставленный шаблон будет доступен в переменной, $MATCHкак \1в BRE или $1PCRE.
И поскольку #это так же, как *, [_a-zA-Z0-9]#будет соответствовать нулю или множеству символов из набора символов [_a-zA-Z0-9].

Связанный контент