web-dev-qa-db-fra.com

Lecture de fichier ligne par ligne (avec espace) dans les scripts Unix Shell - Problème

Je veux lire un fichier ligne par ligne dans les scripts Unix Shell. La ligne peut contenir des espaces de début et de fin et je souhaite lire ces espaces également dans la ligne. J'ai essayé avec "while read line" mais la commande read supprime les espaces de la ligne :( Exemple si line in file est: -

abcd efghijk
 abcdefg hijk

la ligne doit être lue comme suit: - 1) "abcd efghijk" 2) " abcdefg hijk"

Ce que j'ai essayé est ceci (qui n'a pas fonctionné): -

while read line
do
   echo $line
done < file.txt

Je veux une ligne comprenant des espaces et des caractères de tabulation. S'il vous plaît suggérer un moyen.

18
Sourabh Saxena

Essaye ça,

IFS=''
while read line
do
echo $line
done < file.txt

EDIT:

De man bash

IFS - The Internal Field Separator that is used for Word
splitting after expansion and to split lines into words
with  the  read  builtin  command. The default value is
``<space><tab><newline>''
26
sat

Vous voulez lire les lignes raw pour éviter les problèmes de barres obliques inverses dans l'entrée (utilisez -r):

while read -r line; do
   printf "<%s>\n" "$line"
done < file.txt

Cela maintiendra les espaces dans la ligne, mais supprimera les espaces de début et de fin. Pour les conserver également, définissez l’IFS vide, comme dans

while IFS= read -r line; do
   printf "%s\n" "$line"
done < file.txt

Ceci est maintenant un équivalent de cat < file.txt aussi longtemps que file.txt se termine par une nouvelle ligne.

Notez que vous devez faire une double citation "$line" afin d'empêcher la division de Word de la ligne en plusieurs mots, perdant ainsi plusieurs séquences d'espaces.

17
Jens