Gerando parte aninhada de um padrão glob usando a substituição de comando

1

Vamos começar com um exemplo simples de geração de nome de arquivo:

echo (xx|yy|zz)*.txt  # Example 1

Isso lista todos os arquivos txt começando com xx ou yy ou zz. Agora vamos gerar essas alternativas dinamicamente usando a substituição de comandos; Estou usando echo aqui apenas para ilustração de para onde estou indo; em um exemplo do "mundo real", isso seria, claro, algum programa:

echo $(echo '(xx|yy|zz)')*.txt  # Example 2

Isso funcionaria como acima. Agora vem a parte complicada: a substituição de comando deve fornecer apenas PARTE da lista de alternativas:

echo ($(echo 'xx|yy')|zz)*.txt  # Example 3 (does not work)

Isso não funcionaria mais: ele encontraria arquivos começando com zz, mas não aqueles com yy. Eu acho que o Zsh está procurando por arquivos começando literalmente com xx|yy aqui.

Podemos fazer com que funcione, se usarmos uma variável auxiliar:

list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt   # Example 4

Agora, a minha pergunta:

É possível obter o efeito do exemplo 4, sem usar uma variável temporária?

    
por user1934428 28.08.2018 / 10:17

1 resposta

2

Use apenas:

echo (${~"$(echo 'xx|yy')"}|zz)*.txt

Observe as aspas em torno da substituição de comandos, pois zsh realiza a divisão de palavras, se não estiver girando por padrão após a substituição de comandos, o que pode ser útil em coisas como:

echo (${~${(j:|:)$(cmd)}}).txt

para unir as palavras na saída de cmd com | e interpretá-lo como um glob. Veja também o sinalizador de expansão do parâmetro b se você não quiser que essas palavras sejam tratadas como padrões:

echo (${~${(j:|:)${(b)$(cmd)}}}).txt
    
por 28.08.2018 / 10:38

Tags