2010-05-28 21 views
21

en Python:Separar una cadena con zsh como en Pitón

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

¿Cómo puedo conseguir el mismo efecto con zsh?

El siguiente intento falla:

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

Respuesta

43

La solución es utilizar el modificador @, como se indica en the zsh docs:

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

Por cierto, si uno tiene la elección del delimitador, es mucho más fácil y menos propenso a errores utilizar una nueva línea como delimitador. La forma correcta de dividir las líneas con zsh es entonces:

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

No sé si o no las comillas son necesarias aquí también ...

+1

Thanks. Sin embargo, puedes explicar cómo funciona, ¡tantos brackets lo hacen confuso! – CMCDragonkai

+0

Si está intentando dividir en barras, el '/' s original puede reemplazarse con '|' s, parece (por ejemplo 'a = ($ {(s |/|) string}") '). I Parece que no puede encontrar ninguna documentación sobre esto, así que tal vez haya algún cambio de comportamiento sutil. –

+2

@Harry, la documentación vinculada dice esto: "Cualquier carácter, o los pares coincidentes" (...) ',' {. ..} ',' [...] ', o' <...> ', pueden usarse en lugar de dos puntos como delimitadores, .... "En el código de Olivier, el carácter" usado en lugar de dos puntos "era una barra; el suyo, es barra vertical. Entonces, no hay cambio de comportamiento. –

7

Esto funciona tanto en zsh (con setopt shwordsplit o zsh -y) y Bash (matrices basadas en cero):

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

Esto funcionó para mí en el comando línea pero no funcionaría para mí en una función aunque me aseguré de que shwordsplit estuviera configurado. No estoy seguro de por qué no lo hizo. –

+0

@ ws_e_c421: Funciona para mí en una función en zsh y Bash. No dijiste lo que estás usando. Debería poder 'echo $ {a [1]} 'y' echo $ {a [3]} 'y obtener' 1' y '3', respectivamente (los subíndices deberían ser' 0' y '2' para Intento). Si es corto, publique aquí lo que probó y cómo falló exactamente. Si es un poco más largo, publique una nueva pregunta y enlace aquí. –

Cuestiones relacionadas