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

pal*_*ler 61 bash

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

1
 2
  3
   4
Run Code Online (Sandbox Code Playgroud)

当我使用bash文件时

cat test.file |
while read data
do
    echo "$data"
done
Run Code Online (Sandbox Code Playgroud)

它会显示出来

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

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

Dig*_*oss 99

IFS=''
cat test.file |
while read data
do
    echo "$data"
done
Run Code Online (Sandbox Code Playgroud)

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

IFS=''
while read data; do
    echo "$data"
done < test.file
Run Code Online (Sandbox Code Playgroud)

  • 在这里你可以写一个`IFS =读数据; ...` (24认同)
  • 您可能希望使用`IFS = read -r line`来避免反斜杠的解释. (8认同)

Jos*_*ies 22

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

$ cat test.file | while read; do echo "$REPLY"; done
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这个“$REPLY”解决方案在 ZSH 中不起作用,但“IFS= read”解决方案在 ZSH 和 Bash 中都有效。 (3认同)
  • 这个答案促使我仔细阅读“read”的文档。 (2认同)
  • 请注意,如果您的源文件(即源代码)中有任何反斜杠转义字符,例如\ n,则`read`会将其转换为`n`。使用`read -r`可以防止这种情况。 (2认同)

plh*_*lhn 10

也许IFS正如其他人所说,这是关键点。您只需在和IFS=之间添加。whileread

cat test.file | 
while IFS= read data 
 do echo "$data"
 done
Run Code Online (Sandbox Code Playgroud)

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

但正如Joshua Davies 提到的,您更愿意使用预定义的变量$REPLY