Шаблон замены расширения параметра zsh анализирует строку по-другому, если входные данные являются переменной, а не встроенными

Шаблон замены расширения параметра zsh анализирует строку по-другому, если входные данные являются переменной, а не встроенными

Шаблон замены расширения параметра zsh анализирует строку по-другому, если входные данные являются переменной, а не встроенными.

Я предполагаю, что это как-то связано с исчезновением персонажей, но не уверен, как это обойти.

В приведенном ниже коде >& следует отфильтровать из выходных данных printf, что происходит при первом расширении параметра с использованием *переменной .2.5.8versions

Но когда curlвызов встроен, то указанные выше 3 значения не отфильтровываются.

Как можно встроить curlвызов и при этом отфильтровать 3 значения?

#!/usr/bin/env zsh

setopt EXTENDED_GLOB

# variable: 3 values are correctly filtered out
versions=$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')
printf -- '%s\n' ${${(Z+n+)versions//[*+>][ *+>]# [[:graph:]]##}}

# inlined: 3 values are not filtered out
printf -- '%s\n' ${${(Z+n+)$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')//[*+>][ *+>]# [[:graph:]]##}}

решение1

Цитата $(command)замены:

printf -- '%s\n' ${(Z+n+)"$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')"//[*+>][ *+>]# [[:graph:]]##}

(Был один лишний ненужный символ ${}около expn, который удален выше)


В zshоболочке по умолчаниюрасширение параметране нуждается в кавычках, чтобы избежать разделения IFS(но и не повредит).замена командыможет быть разбито на IFS, поэтому необходимо использовать кавычки, чтобы избежать этого.

Руководство zshexpn(1):

PARAMETER EXPANSION

Обратите внимание, в частности, на тот факт, что слова параметров без кавычек не разбиваются автоматически по пробелам, если не SH_WORD_SPLITустановлена ​​эта опция; см. ссылки на эту опцию ниже для получения более подробной информации. Это важное отличие от других оболочек. Однако, как и в других оболочках, пустые слова исключаются из расширений параметров без кавычек.

COMMAND SUBSTITUTION

Если подстановка не заключена в двойные кавычки, вывод разбивается на слова с использованием IFSпараметра.


Кроме того, могут быть и другие способы удаления этих строк, например:

printf -- '%s\n' ${${=versions}:#([*+>-]|2.5.8)}

который можно использовать с заменой команд без кавычек:

printf -- '%s\n' ${$(curl '--silent' '--location' 'https://api.sdkman.io/2/candi'\
'dates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8'):#([*+>-]|2.5.8)}

Вышеприведенное использует расширение параметра в форме ${name:#pattern}. В руководстве говорится:

${name:#pattern}Если шаблон соответствует значению name, то подставьте пустую строку; в противном случае просто подставьте значение name. Если name — массив, соответствующие элементы массива удаляются (используйте флаг (M)для удаления несоответствующих элементов).

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