Soru Python ile olduğu gibi zsh ile bölünmüş dize


Python'da:

s = '1::3'
a = s.split(':')
print a[0] # '1' good
print a[1] # '' good
print a[2] # '3' good

Aynı etkiyi nasıl elde edebilirim zsh?

Aşağıdaki girişim başarısız oluyor:

string="1::3"
a=(${(s/:/)string})
echo $a[1] # 1
echo $a[2] # 3 ?? I want an empty string, as in Python

25
2018-05-28 15:21


Menşei




Cevaplar:


Çözüm kullanmak @ değiştirici, belirtildiği gibi zsh belgeleri:

string="1::3"
a=("${(@s/:/)string}") # @ modifier

Bu arada, bir sınırlayıcı seçimi varsa, bir sınırlayıcı olarak bir satırsonu kullanmak çok daha kolay ve daha az hata eğilimli. Çizgileri zsh ile bölmenin doğru yolu o zaman:

a=("${(f)string}")

Alıntıların burada da gerekli olup olmadığını bilmiyorum ...


46
2018-05-28 15:56



Teşekkürler. Nasıl çalıştığını açıklayabiliyorsunuz, pek çok köşeli ayraç kafa karıştırıcı yapıyor! - CMCDragonkai
Eğik çizgi üzerinde bölünmeye çalışıyorsanız, orijinal /s ile değiştirilebilir |s, öyle görünüyor (ör. a=(${(s|/|)string}")). Bununla ilgili herhangi bir belge bulamıyorum, belki de bazı ince davranış değişiklikleri var. - Harry Cutts
@Harry, bağlantılı belgeler şunu söylüyor: "Herhangi bir karakter veya eşleşen çiftler (...)", "{...}", "[...] 'veya' <...> ', bir kolon yerine sınırlayıcı olarak kullanılabilir,…. " Olivier'in kodunda, "bir kolonun yerine kullanılan" karakter eğikti; seninki, bu dikey çubuk. Yani davranış değişikliği yok. - Rob Kennedy
Bu komut satırında doğru bir şekilde çalıştı, ancak bir işleve taşındığında "tanınmayan değiştirici" hatası aldım, herhangi bir fikir var mı? - satoru
IFS bash eşdeğerinden daha grok daha kolay. Teşekkürler - Peter Kahn


Bu hem zsh (hem de setopt shwordsplit veya zsh -y) ve Bash (sıfır tabanlı diziler):

s="1::3"
saveIFS="$IFS"
IFS=':'
a=(${s})
IFS="$saveIFS"

7
2018-05-28 18:27



Bu benim için komut satırında çalıştı ama shwordsplit ayarlanmış olmasına rağmen bir işlev benim için çalışmayacaktı. Neden olmadığından emin değilim. - ws_e_c421
@ ws_e_c421: Benim için zsh ve Bash işlevlerinde çalışır. Kullandığını söylemedin. Yapabilmelisin echo ${a[1]} ve echo ${a[3]} ve Al 1 ve 3sırasıyla (aboneler olmalıdır 0 ve 2 Bash için). Eğer kısasa, burada denediğin şeyi ve tam olarak nasıl başarısız olduğunu buraya yaz. Biraz daha uzunsa, yeni bir soru yayınlayın ve buraya buradan bağlantı verin. - Dennis Williamson