20

I want to read a file line by line in Unix shell scripting. Line can contain leading and trailing spaces and i want to read those spaces also in the line. I tried with "while read line" but read command is removing space characters from line :( Example if line in file are:-

abcd efghijk
 abcdefg hijk

line should be read as:- 1) "abcd efghijk" 2) " abcdefg hijk"

What I tried is this (which not worked):-

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

I want line including space and tab characters in it. Please suggest a way.

Preeti Maurya
  • 431
  • 1
  • 7
  • 17
Sourabh Saxena
  • 211
  • 1
  • 2
  • 5

2 Answers2

27

Try this,

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

EDIT:

From 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>''
Alexis Wilke
  • 19,179
  • 10
  • 84
  • 156
sat
  • 14,589
  • 7
  • 46
  • 65
  • 8
    Idiomatically, you would specify the empty `IFS` only for the `read` statement, to avoid strange side effects: `while IFS= read line` – l0b0 May 28 '13 at 13:22
19

You want to read raw lines to avoid problems with backslashes in the input (use -r):

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

This will keep whitespace within the line, but removes leading and trailing whitespace. To keep those as well, set the IFS empty, as in

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

This now is an equivalent of cat < file.txt as long as file.txt ends with a newline.

Note that you must double quote "$line" in order to keep word splitting from splitting the line into separate words--thus losing multiple whitespace sequences.

Jens
  • 69,818
  • 15
  • 125
  • 179