2010-05-28 17 views
21

W python:Podział ciąg z zsh jak w Pythonie

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

jaki sposób można osiągnąć ten sam efekt z zsh?

Poniższa próba nie powiedzie:

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

Odpowiedz

43

Rozwiązaniem jest użycie modyfikatora @, jak wskazano w the zsh docs:

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

Nawiasem mówiąc, jeśli ma do wyboru separatora, jest znacznie łatwiejsze i mniej podatne na błędy, aby użyć znaku nowej linii jako ogranicznika. Właściwy sposób, aby podzielić linie z zsh jest następnie:

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

Nie wiem, czy cudzysłowy są niezbędne również tutaj ...

+1

Dzięki. Czy jesteś w stanie wyjaśnić, jak to działa, tak wiele nawiasów sprawia, że ​​jest mylące! – CMCDragonkai

+0

Jeśli próbujesz podzielić na ukośniki, oryginalne '/' s można zastąpić '|' s, wydaje się (np. 'A = ($ {(s |/|) ciąg}") '). nie można znaleźć żadnej dokumentacji na ten temat, więc może nastąpiła subtelna zmiana zachowania –

+2

@Harry, połączona dokumentacja mówi: "Każda postać lub pasujące pary" (...) "," {. ..} ',' [...] 'lub' <...> ', może być użyty w miejsce dwukropka jako ogranicznika, .... "W kodzie Oliviera, znak" używany zamiast dwukropka "był slash; twój, to jest pionowy pasek, więc nie ma zmiany zachowania –

7

to będzie działać zarówno w zsh (z setopt shwordsplit lub zsh -y) i Bash (macierze oparte na zero):

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

To działało dla mnie na komendę linia, ale nie działałaby dla mnie w funkcji, mimo że upewniłem się, że jest ustawiony tryb shwordsplit. Nie jestem pewien, dlaczego tak się nie stało –

+0

@ ws_e_c421: Działa dla mnie w funkcji w zsh i Bash. Nie powiedziałeś, z którego używasz. Powinieneś być w stanie 'echo $ {a [1]}' i 'echo $ {a [3]}' i uzyskać odpowiednio '1' i' 3' (indeksy powinny mieć wartości '0' i' 2' dla Grzmotnąć). Jeśli jest krótka, opublikuj tutaj, co próbowałeś i jak dokładnie się nie udało. Jeśli jest trochę dłużej, opublikuj nowe pytanie i link do niego tutaj. –