2011-02-26 8 views
19

estoy tomando la siguiente estructura de alrededor de la red como un ejemplo básico de cómo leer desde un archivo en BASH:Echo cambia mis pestañas para espacios

cat inputfile.txt | while read line; do echo $line; done 

Mi inputfile.txt está delimitado por tabuladores, sin embargo, y las líneas que salen del comando anterior están delimitadas por espacios.

Esto me causa problemas en mi aplicación real, que es, por supuesto, más compleja que la anterior: quiero tomar la línea, generar algunas cosas nuevas basadas en ella y luego generar la línea original más las cosas nuevas como campos extra Y la canalización será lo suficientemente complicada sin un montón de cut -d ' ' y sed -e 's/ /\t/g' (que de todos modos no sería seguro para los espacios delimitados por tabuladores que contienen espacios).

He visto soluciones de IFS, pero no parecen ayudar en este caso. Lo que quiero es un OFS ... ¡excepto que estoy en eco, no awk! Creo que si pudiera hacer eco para escupir lo que le di, al pie de la letra, estaría en buena forma. ¿Alguna idea? ¡Gracias!

+2

A menudo no es necesario utilizar el gato como parte de un oleoducto, simplemente redirigir la entrada estándar de la siguiente comando directamente desde el archivo: 'mientras lee la línea; hacer eco $ línea; done

Respuesta

28

Probar:

cat inputfile.txt | while read line; do echo "$line"; done 

lugar.

En otras palabras, no es read reemplazando las pestañas, es echo.

Véase la siguiente transcripción (usando <<tab>> donde las fichas son):

pax$ echo 'hello<<tab>>there' | while read line ; do echo $line ; done 
hello there 

pax$ echo 'hello<<tab>>there' | while read line ; do echo "$line" ; done 
hello<<tab>>there 
+2

Buena pena; fue así de fácil? ¡Gracias! Una buena práctica para poner las comillas de todos modos. –

+2

Reemplazar las pestañas es una conspiración entre (ba) sh y echo. 'echo $ line' se divide en palabras, que luego se engloban y se pasan por separado a echo, que luego se une con espacios. 'echo" $ line "' pasa la cadena tal como está. En comparación, DOS/Windows 'echo% line%' no hace ninguna de estas cosas (y de hecho incluso los echos citan caracteres literalmente). – Neil

+10

BTW 'read' borrará los espacios en blanco iniciales y finales, por lo que si desea conservar las pestañas iniciales/finales, use' ... mientras IFS = leer línea ... '(tenga en cuenta que la asignación a IFS es un prefijo en el comando de lectura, solo se aplica a eso y no tiene que reiniciarse después). –

Cuestiones relacionadas