Para lo que vale, necesito hacer eso con bastante frecuencia, y nunca puedo recordar la forma exacta de usarlo while IFS= read...
, así que definí la siguiente función en mi perfil de bash:
# iterate the line of a file and call input function
iterlines() {
(( $# < 2 )) && { echo "Usage: iterlines <File> <Callback>"; return; }
local File=$1
local Func=$2
n=$(cat "$File" | wc -l)
for (( i=1; i<=n; i++ )); do
"$Func" "$(sed "${i}q;d" "$File")"
done
}
Esta función primero determina el número de líneas en el archivo, luego usa sed
para extraer línea tras línea y pasa cada línea como un argumento de cadena simple a cualquier función dada. Supongo que esto podría volverse realmente ineficiente con archivos grandes, pero eso no ha sido un problema para mí hasta ahora (sugerencias sobre cómo mejorar esta bienvenida, por supuesto).
El uso es bastante dulce IMO:
>> cat example.txt # note the use of spaces, whitespace, etc.
a/path
This is a sentence.
"wi\th quotes"
$End
>> iterlines example.txt echo # preserves quotes, $ and whitespace
a/path
This is a sentence.
"wi\th quotes"
$End
>> x() { echo "$#"; }; iterlines example.txt x # line always passed as single input string
1
1
1
1
1
<
un ciclo completo. Aunque tiene mucho sentido ahora lo vi