在Unix Shell脚本中逐行(带空格)读取文件 - 问题

20

我希望在Unix shell脚本中逐行读取文件。每行可能包含前导和尾随空格,我希望在读取行时也能保留这些空格。 我用“while read line”尝试过,但是read命令会从行中删除空格字符:( 例如,如果文件中的行是:

abcd efghijk
 abcdefg hijk

行应该读作: 1)“abcd efghijk” 2)“abcdefg hijk”

我尝试过这个(但没有成功):

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

我想在一行文字中包含空格和制表符,请提供一种方法。

2个回答

27

试一试这个,

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

8
习惯用语地说,你只会在read语句中指定空的IFS,以避免奇怪的副作用:while IFS= read line - l0b0

19

使用-r可以避免输入中反斜杠的问题,你需要阅读原始行:

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

这将保留行内的空格,但会删除开头和结尾的空格。如果也想保留开头和结尾的空格,请将IFS设置为空,例如:

这将保留行内的空格,但会删除开头和结尾的空格。如果也想保留开头和结尾的空格,请将IFS设置为空,例如:

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

只要file.txt以换行符结尾,那么这现在就相当于cat < file.txt的等价形式。

请注意,您必须对"$line"使用双引号,以防止单词拆分将该行拆分为多个单词-从而丢失多个空格序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接