2012-01-01 10 views
7

en bash en Mac OS X, que tienen un archivo (caso de prueba) que contiene las líneasen bash, "para, hacer eco; hecho" líneas de fracturas en espacios

x xx xxx 
xxx xx x 

Pero cuando ejecuto el comando

for i in `cat r.txt`; do echo "$i"; done 

el resultado no es

x xx xxx 
xxx xx x 

como yo quiero, sino más bien

x 
xx 
xxx 
xxx 
xx 
x 

¿Cómo hago echo para darme 'x xx xxx'?

+0

awk 'gsub (/ /, "\ n") {print} ' o sed'// \ n/g ' – kenny

Respuesta

16

Por defecto, un Bash for loop se divide en todos los espacios en blanco. Puede anular que al establecer la variable IFS:

IFS=$'\n' 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+0

quizás apunte el OP hacia el uso de 'while read; hacer ... hecho

+0

@Fredrik: Quizás, aunque eso ejecuta cada iteración en una subcategoría separada ... –

+0

perfecta. gracias. Había mirado el método 'while' pero tenía otros problemas que parecían mucho más difíciles de superar que este problema de eco. – atheaos

-1
IFS="\n" 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+1

No funciona ... –

+0

@OliCharlesworth Por cierto, mientras estaba probando su respuesta, dejé accidentalmente los $ y escribí exactamente lo que Arenielle tiene aquí. Funcionó. Aunque ahora, al ejecutarlo en más datos involucrados, veo que aparentemente hay otros efectos secundarios. – atheaos

+0

@atheaos: ¿Estás seguro? '" \ n "' en Bash no es lo mismo que en C. Intenta cambiar tu declaración 'echo' a, p. 'echo" LINE: $ i "' para ver qué está pasando realmente. –

3

cualquiera de estos parámetros IFS como se sugiere o utilizar while:

while read theline; do echo "$theline"; done <thefile 
+0

Debe señalarse que esto ejecuta cada iteración en una subcategoría separada ... –

+0

Sí, de hecho. Editado – fge

+0

No es la eficiencia en la que estaba pensando. En cambio, estaba pensando en el problema del alcance variable (las variables no se comparten entre "adentro" y "afuera" del ciclo). –

Cuestiones relacionadas