2013-08-02 6 views
5

speciali Io so come generare facilmente un elenco in questo modo:Come generare un elenco con espansione delle parentesi graffe per

echo {a,b,c,d}_{0..3}

che darà:

a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3

Ma come generare la stessa lista, ma con la seconda coppia viene speso con una priorità higer, per ottenere questo? :

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

Qualsiasi trucco come l'ordinamento dalla fine, o dal carattere n è OK, fintanto che in una sola riga. Sto anche usando zsh, ma qualcosa che funziona con bash va bene.

risposta

6

che non è implementata, ma si potrebbe usare un brutto hack come

echo $(eval echo \{a,b,c,d\}_{0..3}) 

per realizzarla da attivamente primo valutando quest'ultimo brace e nella seconda fase la prima parentesi.

Occorre tuttavia tenere presente che il passaggio intermedio deve essere abbastanza piccolo per essere ancora analizzabili dalla shell ;-)

+1

+1 per l'ultima frase. –

1

vorrei aggiungere un altro approccio per risolvere questo problema con un hack diverso. Si basa su girando l'espressione, valutando poi, poi girando il risultato di nuovo:

eval echo $(echo '{a,b,c,d}_{0..3}' | rev | tr '{}' '}{') | rev 

risultati in

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3 

Ma io non sono sicuro che posso davvero proporre di fare questo ;-)

1

Non strettamente bash-in-casa, ma

printf "%s\n" {a,b,c,d}_{0..3} | sort -t_ -k2,2n 
2

ho trovato anche un altra soluzione (zsh solo), needlessl y complessa e quindi interessante:

print {a,b,c,d}_${^=${$+0 1 2 3}}

Cosa sta facendo zsh qui? Si inizia con l'ultimo brace nested e:

  • controllo se $$ esiste, quindi usare "0 1 2 3" (operatore +)
  • diviso in un array (operatore =)
  • diffusa distribuzione di ciascun elemento alla stringa, come espansione delle graffe (operatore ^)
  • infine diffusa espansione della prima parentesi (a causa della priorità di espansione inferiore tutore rispetto ad espansione di parametro)

Nota che devo espandere {0..3} mia auto, poiché nessun flag/operatore può attivare un'espansione preliminare di questo tipo AFAIK (eccetto lo eval come spiegato sopra).