2011-01-27 11 views
5

Tengo un archivo file.txt con contenidos comoCómo leer toda la línea de golpe

i love this world 

I hate stupid managers 
I love linux 

I have MS 

Cuando hago lo siguiente:

for line in `cat file.txt`; do 
echo $line 
done 

Se da salida como

I 
love 
this 
world 
I 
.. 
.. 

Pero Necesito la salida como líneas enteras como por debajo — alguna idea?

i love this world 

I hate stupid managers 
I love linux 

I have MS 
+2

su pregunta se lee como lo que desea es hacer 'cat file.txt' –

+0

que Zac segundo, tiene que haber algo más complejo que hay que hacer aquí, y es probable que también ya una herramienta de Unix para hacerlo – tobyodavies

+0

Lo siento, puede ser que debería tener más claro, necesito obtener línea por línea y analizar esta línea.Entonces, el gato no será útil en mi caso. –

Respuesta

10
while read -r line; do echo "$line"; done < file.txt 
+0

+1. Por lo general, querrás usar 'read -r'. –

+0

Gracias, buena captura (otra vez) – SiegeX

6

Como @Zac señaló en los comentarios, la solución más sencilla a la pregunta que publicas es simplemente cat file.txt así que hay que suponer que hay algo más interesante en lo que he puesto las dos opciones que resuelven el pregunta preguntó así:

hay dos cosas que puede hacer aquí, tampoco se puede establecer IFS (Separador de campo interno) a un salto de línea y el uso de código existente, o puede utilizar el comando read o line en un bucle while

IFS=" 
" 

o

(while read line ; do 
    //do something 
done) < file.txt 
+4

'IFS = $ '\ n'' es más legible. No es necesario colocar el bucle 'while' en una subcamada. –

+0

¿Eso funciona Dennis? ¡He estado intentando poner mi configuración 'IFS' en una línea durante meses y me rendí porque pensé que no se podía hacer! – tobyodavies

+1

Encuentro que la notación '(...)' es algo más fácil de leer y el rendimiento raramente es considerado en las secuencias de comandos bash. – tobyodavies

-1

Trate

(while read l; do echo $l; done) < temp.txt 

de lectura: leer una línea del entrada estándar, que se dividió en campos.

Lee una sola línea de la entrada estándar, o del archivo descriptor FD si se proporciona la opción -u. La línea se divide en campos como con la división de palabra , y la primera palabra se asigna al primer NOMBRE, la segunda palabra al segundo NOMBRE, y así sucesivamente, con cualquier palabra sobrante asignada a el último NOMBRE. Solo los caracteres encontrados en $ IFS son reconocidos como delimitadores de palabra .

+0

No necesita (y no debería) use) los parens, estos crean un subconjunto superfluo. Además, no te di el -1, pero supongo que la razón por la que alguien lo hizo fue porque tu respuesta es un duplicado exacto dado unos minutos antes. – SiegeX

+0

Personalmente me gusta la notación '(...)', me resulta mucho más fácil de leer ... y las aceleraciones en la región de 1ms rara vez son útiles en bash – tobyodavies

+0

@Siege: Naturalmente, uno se volverá casi idéntico respuestas obvias al mismo tiempo. (El tuyo no estaba allí cuando compuse; no citar 'help read' hubiera ahorrado un minuto, ¿pero cui bono?) –

1

Puede hacerlo utilizando read si el archivo entra en stdin. Si necesita hacerlo en medio de una secuencia de comandos que ya usa stdin para otros fines, puede reasignar temporalmente el descriptor de archivo stdin.

#!/bin/bash 
file=$1 

# save stdin to usually unused file descriptor 3 
exec 3<&0 

# connect the file to stdin 
exec 0<"$file" 

# read from stdin 
while read -r line 
do 
    echo "[$line]" 
done 

# when done, restore stdin 
exec 0<&3 
+0

¿Hay algún problema con la redirección al ciclo while? – tobyodavies

+0

no, simplemente agregando un enfoque diferente para resaltar la manipulación del descriptor de archivo que es esotérico pero que tiene sus aplicaciones. – thatbrentguy

+0

... por ejemplo, si desea llamar a alguna función existente de la biblioteca que ya estaba escrita para usar stdin pero desea que la dibuje desde un archivo, puede usar esta técnica para hacerlo sin tener que volver a codificar la función – thatbrentguy

1

Creo que la pregunta era cómo leer en una línea completa a la vez. El sencillo script a continuación hará esto. Si no especifica un nombre de variable para "leer", rellenará toda la línea con la variable $ RESPUESTA.

cat archivo.txt | while read; hacer eco $ RESPUESTA; hecho

de Dave ..

+0

También tenga en cuenta que de esta manera, el control también se transfiere a la CLI después de que se lee el archivo. Esto es especialmente importante si está canalizando el resultado de un comando al 'while' en lugar de un archivo, que tiene un EOF, la salida CLI no lo hace y dejaría el comando esperando más. Por ejemplo: 'buscar. -name 'readme.txt' | mientras lee la línea; hacer eco $ línea; done' (devuelto al usuario) vs 'while read line; hacer eco $ línea; hecho | encontrar . -name 'readme.txt'' (espera la entrada) –

Cuestiones relacionadas