Sağdan sola kabuk destek genişletmesi


9

Zsh (ve diğer mermiler) 'de, (örneğin) gibi bir argüman eklerseniz:

{a,b,c}{d,e,f}

küme ayracı genişletme:

ad ae af bd be bf cd ce cf

Benim amacım için, argüman sırası önemlidir ve soldan sağa yerine sağdan sola genişlemek için parantezlere ihtiyacım var. Yani, genişlemenin olmasını istiyorum:

ad bd cd ae be ce af bf cf

Birden çok küme parantezinin genişletilme sırasını kontrol etmenin bir yolu var mı? Sadece bu argümanlarla değil, her durumda işe yarayacak bir şey arıyorum.


Döngüler veya sıralı çıktı içeren daha karmaşık çözümlerle ilgilenmediğinizi düşünüyorum, değil mi?
terdon

@terdon Sanırım başka bir yol yoksa; Küme ayracı genişlemesinin değerlendirme sırasını değiştirmek için bazı hileler olduğunu umuyordum, ama muhtemelen yok. Bu argümanlar sadece bir örnekti, bu yüzden sadece işe yarayan bir şey {a,b,c}{d,e,f}çok yararlı değil
Michael Mrozek

Evet, tahmin ediyorum. Sıralama düzenine dayalı yanıtlardan kaçınmak için bunu açıkça belirtmek isteyebilirsiniz.
terdon

Ayrıca bkz . Özel sırada
küme

Yanıtlar:


8

Parametre genişletmeyi küme ayracı genişletmeyle birleştirebilirsiniz.

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

fooAyrı olarak tanımlamak istemiyorsanız (muhtemelen göründüğü gibi) aşağıdakileri kullanabilirsiniz:

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

Eğer varsa rcexpandparamseçeneği ayarlanmış, o zaman gerek yok ^bu davranışı etkinleştirmek için her iki örnekte.

(Not: test ederken, ben de shwordsplitseçenek kümesi vardı . Eğer ayarlanmadıysanız, örneğin, deneyin echo {a,b,c}${^=:-d e f}. Hikayenin ahlakı: hemen hemen her şey mümkündür zsh, ancak doğru kullandığınızdan emin olmalısınız seçenekler ve sözdiziminin birleşimi.)


1
print -- {a,b,c}${^=:-d e f}Ana örnek olarak kullanmalısınız , çünkü ne zaman split+globiçinde varsayılan olarak kapatılmıştır zsh.
cuonglm

4

İçinde zshaşağıdakileri yapmak için -C belirtilen sayıda sütun bağımsız değişkenini kullanabilirsiniz print:

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

...almak...

ad bd cd ae be ce af bf cf

... $IFSaşağıdakileri ayırmadan :

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

... baskılar ...

ad bd cd
ae be ce
af bf cf

... ama bunu daha önce olduğu gibi yapabilirsiniz ...

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

ad ae af
bd be bf
cd ce cf

...veya...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

Bu, MIchael'in kaçınmaya çalıştığı çıktıyı üretir. 1.1 2.1 3.1 istiyor ve 1.1 1.2 1.3 veriyorsunuz (açıksa).
terdon

@terdon - iyi bir nokta.
mikeserv

(Açıkça belirtilmese de) Michael'ın eşleştirme sırasından sonra olduğunu tahmin ediyorum. Yaklaşımınız yalnızca öğeler alfabetik olarak sıralanabilirse işe yarar. foobad foobaz barbad barbaz{Foo, bar} {bad, baz} `dan gelmeye ne dersiniz ?
terdon

@terdon - Peki, eğer peşinde olan buysa neden söylemiyorsun? her neyse, eğer matematik yaparsanız sütunlar herhangi bir şekilde eşleştirilebilir.
mikeserv

1
@terdon - moderatörler bunu kastetmediğinizi söylemeyi alışkanlık haline getiriyor gibi görünüyor.
mikeserv

2

İkinci kümenin her öğesinin sonuna sayı koyabilir ve ardından son karakteri sıralayabilirsiniz:

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

Daha da iyisi, bazı ayırıcıdan (boşluk) sonra sayı eklemek, karakterleri değil alanları kesmek olabilir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.