当我使用“cat test.file”时,它会显示
1
2
3
4
当我使用bash文件时,
cat test.file |
while read data
do
echo "$data"
done
会显示
1
2
3
4
我怎样才能像原始测试文件那样制作结果?
答案 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
。