Expansão da cinta shell da direita para a esquerda

9

Em zsh (e outros shells), se eu incluir um argumento como (por exemplo):

{a,b,c}{d,e,f}
A expansão de

brace a transforma em:

ad ae af bd be bf cd ce cf

Para os meus propósitos, a ordem dos argumentos é importante e preciso que as chaves se expandam da direita para a esquerda, e não da esquerda para a direita. Ou seja, eu quero que a expansão seja:

ad bd cd ae be ce af bf cf

Existe uma maneira de controlar a ordem em que vários conjuntos de chaves são expandidos? Estou procurando algo que funcione em qualquer situação, não apenas com esses argumentos.

    
por Michael Mrozek 22.11.2015 / 17:36

4 respostas

8

Você pode combinar a expansão de parâmetros com a expansão de chaves.

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

Se você não quiser definir foo separadamente (como parece provável), você pode usar o seguinte:

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

Se você tiver a opção rcexpandparam definida, não será necessário o ^ nos dois exemplos para ativar esse comportamento.

(Nota: durante o teste, também tive a opção shwordsplit definida. Se você não tiver definido, tente, por exemplo echo {a,b,c}${^=:-d e f} . Moral da história: quase tudo é possível em zsh , mas você precisa ter certeza de que está usando a combinação correta de opções e sintaxe.)

    
por 23.11.2015 / 00:30
4

Em zsh você pode usar o argumento -C número especificado de colunas para print como:

print $(print -C3 {a,b,c}{d,e,f})

... para obter ...

ad bd cd ae be ce af bf cf

... sem o $IFS dividindo o seguinte:

print -C3 {a,b,c}{d,e,f}

... imprime ...

ad bd cd
ae be ce
af bf cf

... mas você pode fazer isso antes de descer como ...

print -aC3 {a,b,c}{d,e,f}
ad ae af
bd be bf
cd ce cf

... ou ...

print $(print -aC2 {foo,bar}{bad,baz})
foobad foobaz barbad barbaz
    
por 22.11.2015 / 17:50
2

Você pode colocar o número no final de cada elemento do segundo conjunto e depois classificar no último caractere:

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

Melhor ainda seria adicionar números após algum separador (espaço), para cortar campos, não caracteres:

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '
    
por 22.11.2015 / 19:02
1

Em fish shell, você tem esse comportamento por padrão, porque a expansão em fish é executada corretamente para a esquerda :

$ fish -c 'echo {a,b,c}{d,e,f}'
ad bd cd ae be ce af bf cf
    
por 23.11.2015 / 04:30