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

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

1 2 3 4 

当我使用bash文件时,

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

它会显示

 1 2 3 4 

我怎么能像原来的testing文件一样做出结果呢?

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

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

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

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

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

只是为了补充DigitalRoss的回应。 对于这种情况,你想改变IFS只是为了这个命令,你可以使用花括号。 如果这样做,IFS的值只会在块内部更改。 喜欢这个:

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

输出将是(保持空格):

  word1 check word2 check 

read data将通过IFS (通常是“\ t \ n”)分割数据。 这将为你保留空白:

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

或者,使用一个好的文件parsing工具,比如awk

 awk '{ # do your stuff print }' file