2013-08-02 5 views
5

wiem, jak łatwo wygenerować listę w ten sposób:Jak wygenerować listę z interpretacji nawiasów w specyficzny porządek

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

które dadzą:

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

ale jak wygenerować tę samą listę, ale przy drugim klamrze wydatkowanym z wyższym priorytetem, aby to uzyskać? :

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

Każda sztuczka jak sortowanie od końca, albo od charakteru n jest OK, o ile mieści się na jednej linii. Używam również Zsh, ale coś działającego z bashem jest w porządku.

Odpowiedz

6

To nie jest realizowane, ale można użyć brzydkiego siekać jak

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

to osiągnąć poprzez aktywne pierwsze oceny ostatni nawias i w drugim etapie pierwszego nawiasu.

Należy pamiętać jednak, że etap pośredni musi być wystarczająco małe, aby być nadal parsable przez powłokę ;-)

+1

+1 za ostatnie zdanie. –

1

Chciałbym dodać kolejne podejście rozwiązywania tego problemu z innym hack. Jest on oparty na przekręcenie wyraz, oceniając je następnie, następnie obracając wynik powrotem:

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

wyników w

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 

Ale nie jestem pewien, czy naprawdę może zaproponować, aby to zrobić ;-)

1

Nie ściśle bash-w-domu, ale

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

znalazłem też inne rozwiązanie (zsh tylko), needlessl y kompleks i dlatego interesujący:

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

Co robi zsh tutaj? Zaczyna się ostatni nawias i zagnieżdżonych:

  • sprawdzić, czy $$ istnieje, więc używać "0 1 2 3" (operator +)
  • podzielić ją na tablicę (operator =)
  • stosuje dystrybucję każdy element łańcucha, jak interpretacji nawiasów (operator ^)
  • wreszcie zastosować ekspansję pierwszego nawiasu (ze względu na niższy priorytet interpretacji nawiasów porównaniu do dopełniania parametrów)

Note, że muszę rozwinąć {0..3} mój self, ponieważ żadna flaga/operator nie może uruchomić wstępnej ekspansji tego typu AFAIK (z wyjątkiem eval, jak wyjaśniono powyżej).