
Я наткнулся на скрипт 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 или $1
PCRE.
И поскольку #
это так же, как *
, [_a-zA-Z0-9]#
будет соответствовать нулю или множеству символов из набора символов [_a-zA-Z0-9]
.