使用bash逐行读取并保留空间

时间:2011-09-06 01:10:14

标签: bash

当我使用“cat test.file”时,它会显示

1
 2
  3
   4

当我使用bash文件时,

cat test.file |
while read data
do
    echo "$data"
done

会显示

1
2
3
4

我怎样才能像原始测试文件那样制作结果?

6 个答案:

答案 0 :(得分:91)

IFS=''
cat test.file |
while read data
do
    echo "$data"
done

我意识到你可能已经从真正需要管道的东西中简化了这个例子,但是在别人说出来之前:

IFS=''
while read data; do
    echo "$data"
done < test.file

答案 1 :(得分:17)

实际上,如果你没有为“read”调用提供参数,read将设置一个名为$ REPLY的默认变量,它将保留空格。所以你可以这样做:

$ cat test.file | while read; do echo "$REPLY"; done

答案 2 :(得分:4)

只是为了补充DigitalRoss的回应。 对于您希望仅针对此命令更改IFS的情况,您可以使用花括号。如果这样做,IFS的值将仅在块内更改。 像这样:

echo '
  word1
  word2' |  { IFS='' ; while read line ; do echo "$line" check ; done ; }

输出将是(保留空格):

  word1 check
  word2 check

答案 3 :(得分:1)

read data将按 IFS 分割数据,通常为“\ t \ n”。这将为您保留空白:

var=$(cat test.file)
echo "$var"

答案 4 :(得分:0)

或者,使用一个好的文件解析工具,如awk

awk '{
 # do your stuff
 print 
}' file

答案 5 :(得分:0)

也许IFS是其他人所说的重点。您只需在IFS=while之间添加read

cat test.file | 
while IFS= read data 
 do echo "$data"
 done

并且不要忘记引用$data,否则echo会修饰空格。

但是作为Joshua Davies mentioned,您希望使用预定义的变量$REPLY