2009-12-29 26 views

Respuesta

4

La opción -a de read le permitirá dividir una línea leída por los caracteres que figuran en $IFS.

+0

#/bin/bash archivo = $ 1 mientras Leer línea hacer \t echo $ LÍNEA! | leer -a hecho <$ nombre de archivo ¿debería funcionar? – asdf

+0

No, -a sería un argumento para la primera lectura. "ayudar a leer" en una línea de comando bash, eh ... ayuda. –

+2

@asdf: Se vería así: 'filename = $ 1; mientras lees -a LINEA; hacer eco de "$ LINE"; done <"$ filename" ' –

9
$ line="these are words" 
$ ll=($line) 
$ declare -p ll # dump the array 
declare -a ll='([0]="these" [1]="are" [2]="words")' 
$ for w in ${ll[@]}; do echo $w; done 
these 
are 
words 
+1

+1 por enseñarme la opción -p – grok12

110
s='foo bar baz' 
a=($s) 
echo ${a[0]} 
echo ${a[1]} 
... 
+1

esto que estaba buscando, gracias – asdf

+14

Esto debe marcarse como la respuesta correcta – jaywink

+0

Variante en línea: BAR =" $ (a = ($ value)); echo $ {a [1]})" –

28

Depende de lo que entendemos por dividido. Si desea iterar sobre palabras en una línea, que está en una variable, puede simplemente iterar. Por ejemplo, supongamos que la variable line es this is a line. A continuación, puede hacer esto:

for word in $line; do echo $word; done 

Esto imprimirá:

this 
is 
a 
line 

for .. in $var divisiones $var utilizando los valores de $IFS, el valor por defecto de lo que significa "espacios en blanco y saltos de línea divididas".

Si desea leer las líneas de usuario o un archivo, se puede hacer algo como:

cat $filename | while read line 
do 
    echo "Processing new line" >/dev/tty 
    for word in $line 
    do 
     echo $word 
    done 
done 

Para cualquier otra cosa, tiene que ser más explícitos y definir su pregunta con más detalle.

Nota: Editado para eliminar bashism, pero todavía guardo cat $filename | ... porque me gusta más que la redirección.

+5

Uso inútil de 'cat' - redirigir el archivo de esta manera:' done <"$ filename" '. Además, use 'para el valor en" $ {var [@]} "' en este contexto en lugar de una variable de índice. Mientras que en este caso la matriz puede ser contigua, Bash admite matrices dispersas y '$ {# var [@]}' puede no ser la última entrada (aunque '$ {var [@]: -1}' será e 'índices = ($ {! a [@]}); count = $ {# indices [@]} 'dará la lista de índices y el conteo correcto) –

+1

@Dennis: Todos son buenos puntos. Estoy acostumbrado a 'cat a | blah' en lugar de 'blah

+1

Este enfoque fallará si tiene un buen asterisco (*) en la línea $. Bash lo reemplazará con la lista de archivos en el directorio actual. – crenate

2

Si usted ya tiene su línea de texto en un $ de línea variable, entonces usted debería ser capaz de decir

for L in $LINE; do 
    echo $L; 
done 
9

hacer esto

while read -r line 
do 
    set -- $line 
    echo "$1 $2" 
done <"file" 

$ 1, $ 2, etc. será su primera y 2º "campos" divididos. use $ @ para obtener todos los valores ... use $ # para obtener la longitud de los "campos".

+1

Tenga en cuenta que si su '$ line' contiene, p. Ej. '*', esto se expandirá con bash cuando se haga 'set - $ line', lo que puede tener efectos sorprendentes. – clacke

+0

1) ¿Qué hace el "-"? 2) ¿Qué efectos sorprendentes puede expandir *? – Xofo

27

Si quiere una palabra específica de la línea, awk puede ser útil, p.

 
$ echo $LINE | awk '{print $2}' 

Imprime la segunda palabra separada en blanco en $ LINE. También puedes dividir en otros personajes, p.

 
$ echo "5:6:7" | awk -F: '{print $2}' 
6 
+1

Esta es mi razón para comenzar a usar awk ahora mismo. A diferencia de la creación de matriz y líneas adicionales. -F: simplemente explota desde: en una sola línea. Me encanta, thx. – erm3nda

+0

además: 'echo" 5 :: 6: 7 "| awk -F :: '{print $ 2}' ' ' 6: 7' (diferente del corte, que toma solo un carácter como delimitador) – ribamar

5

Más simple,

echo $line | sed 's/\s/\n/g' 

\s --> whitespace character (space, tab, NL, FF, VT, CR). In many systems also valid [:space:]

\n --> new line

15
echo $line | tr " " "\n" 

da la salida similares a los de la mayoría de las respuestas anteriores; sin usar bucles


En su caso, también se menciona ll=<...output...>,
así, (dado que yo no sé mucho de pitón y suponiendo que necesita asignar la salida a una variable),

ll=`echo $line | tr " " "\n"` 

debería ser suficiente (recuerda a echo "$ll" en lugar de echo $ll)

Cuestiones relacionadas