Generando parte anidada de un patrón global usando sustitución de comandos

Generando parte anidada de un patrón global usando sustitución de comandos

Comencemos con un ejemplo simple de generación de nombres de archivos:

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

Esto enumera todos los archivos txt que comienzan con xx, yy o zz. Ahora generemos esas alternativas dinámicamente usando sustitución de comandos; Estoy usando echoaquí sólo como ilustración de hacia dónde me dirijo; en un ejemplo del "mundo real", este sería, por supuesto, algún programa:

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

Esto funcionaría como arriba. Ahora viene la parte complicada: la sustitución del comando sólo debería proporcionar PARTE de la lista de alternativas:

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

Esto ya no funcionaría: encontraría archivos que comenzaran con zz, pero no aquellos con yy. Supongo que Zsh está buscando archivos que comiencen literalmente con xx|yyaquí.

Podemos hacerlo funcionar, si usamos una variable auxiliar:

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

Ahora a mi pregunta:

¿Es posible lograr el efecto del ejemplo 4 sin utilizar una variable temporal?

Respuesta1

Solo usa:

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

Tenga en cuenta las comillas alrededor de la sustitución de comandos, al igual zshque la división de palabras, si no el globbing de forma predeterminada tras la sustitución de comandos, lo que puede resultar útil en cosas como:

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

para unir las palabras en la salida de cmdwith |e interpretarlas como un globo. Consulte también el bindicador de expansión de parámetros si no desea que esas palabras se traten como patrones en sí mismas:

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

información relacionada