sábado, 31 de octubre de 2009

For each line en bash

En ocasiones podemos necesitar desde un script en bash analizar cada una de las lineas de un fichero. Un bucle for es una buena opción para ello.

Supongamos que tenemos un fichero llamado fichero con el siguiente contenido:

uno dos tres
cuatro cinco
seis

Y un script analizar.sh con el siguiente código:

#!/bin/bash

LINEAS=$(cat fichero)

for LINEA in $LINEAS
do
  echo $LINEA
done

Si lo ejecutamos, veremos que la salida no es la esperada:

$ ./analizar.sh
uno
dos
tres
cuatro
cinco
seis

Esto ocurre porque un bucle en bash usa para separar los campos espacios en blanco, saltos de linea, etc. Tendremos que decir a bash que el separador sea exclusivamente el salto de linea:

#!/bin/bash

IFS="
"
LINEAS=$(cat fichero)

for LINEA in $LINEAS
do
  echo $LINEA
done

La variable IFS (Internal Field Separator) es una variable interna de bash que especificará el caracter separador. Con este simple cambio, podremos procesar cada linea de un fichero según nuestras necesidades.