2013-05-28 315 views
15

我想在Unix shell脚本中逐行读取文件。行可以包含前导和尾随空格,我想读取这些行中的空格。 我试着用“而读行”,但如果读取文件中的行是命令去除线:( 例空格字符: -在Unix Shell脚本中逐行读取文件(空格) - 问题

abcd efghijk 
abcdefg hijk 

行应读作: - 1) "abcd efghijk" 2) " abcdefg hijk"

什么我想是这样的(这不工作): - 。

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

我想线,包括它的空间和制表符 请提出一个方法

回答

22

试试这个,

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

编辑:

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>'' 
+0

工作正常! 谢谢。 Plz解释关于IFS。 –

+0

更新了帖子。 – sat

+7

在习惯上,您只需为'read'语句指定空的'IFS',以避免奇怪的副作用:'while IFS = read line' – l0b0

15

你想读原料线,以避免输入用反斜杠的问题(使用-r) :

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

这将保留行内的空白,但删除前导和尾随空白。为了让那些为好,设置IFS为空,如

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

这是现在只要file.txt以换行符结束的cat < file.txt等效。

请注意,您必须双引号"$line",以防止单词拆分将行拆分为单独的单词 - 因此会丢失多个空格序列。

+0

感谢您的描述。 –

+2

@SourabhSaxena不客气。在Stackoverflow上表达“感谢”的方式是通过点击答案左侧的向上箭头来进行投票。 – Jens