Ce qui suit lit un fichier passé en argument ligne par ligne :
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
C'est le formulaire standard pour lire les lignes d'un fichier dans une boucle. Explication :
-
IFS=
(ou IFS=''
) empêche que les espaces blancs de début et de fin soient coupés.
-
-r
empêche les échappements de backslash d'être interprétés.
Ou vous pouvez le mettre dans un fichier bash helper script, exemple de contenu :
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Si ce qui précède est sauvegardé dans un script avec un nom de fichier readfile
il peut être exécuté comme suit :
chmod +x readfile
./readfile filename.txt
Si le fichier n'est pas un fichier texte POSIX standard (= non terminé par un caractère de nouvelle ligne), la boucle peut être modifiée pour gérer les lignes partielles de fin de ligne :
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Ici, || [[ -n $line ]]
empêche la dernière ligne d'être ignorée si elle ne se termine pas par un caractère \n
(depuis read
renvoie un code de sortie non nul lorsqu'il rencontre EOF).
Si les commandes à l'intérieur de la boucle lisent également à partir de l'entrée standard, le descripteur de fichier utilisé par la commande read
peuvent être changés en quelque chose d'autre (évitez les descripteurs de fichiers standard ), par exemple :
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Les shells non-Bash peuvent ne pas connaître read -u3
; utiliser read <&3
à la place).
4 votes
Ces questions peuvent-elles être fusionnées d'une manière ou d'une autre ? Les deux questions ont de très bonnes réponses qui mettent en évidence différents aspects du problème, les mauvaises réponses sont expliquées en détail dans les commentaires, et pour l'instant, il n'est pas possible d'avoir une vue d'ensemble de ce qu'il faut prendre en compte, à partir des réponses d'une seule question de la paire. Il serait utile d'avoir tout cela en un seul endroit, plutôt que de l'éparpiller sur deux pages.