Pelo que vale a pena, eu preciso fazer isso com bastante frequência e nunca consigo me lembrar da maneira exata de usar while IFS= read...
, então defini a seguinte função no meu perfil do 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
}
Essa função determina primeiro o número de linhas no arquivo, depois usa sed
para extrair linha após linha e passa cada linha como um argumento de cadeia única para qualquer função. Suponho que isso possa ficar realmente ineficiente com arquivos grandes, mas isso não foi um problema para mim até agora (sugestões sobre como melhorar essa recepção, é claro).
O uso é muito doce 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
<
um loop inteiro. Embora faça todo o sentido agora eu vi