在 bash 中遍历文件时保留空格

preserve whitespace while iterating over a file in bash

我需要遍历 bash 中文本文件的行,我想保留空格。最终目标是提供 this line 个可能包含空格的短语。

所以,给定一个 phrase_file 包含

xdebug
var_dump
 dump(
pwet
meuh
coin

当我尝试这个时:

while read -r PHRASE
do
    echo "$PHRASE"
done < phrase_file

输出为:

xdebug
var_dump
dump(
pwet
meuh
coin

dump()之前的空格去哪儿了,我怎样才能找回来?

您可以使用内置的 $REPLY 变量,它捕获整行:

while read -r; do
    echo "$REPLY"
done < phrase_file

请注意,如果您命名一个变量(如示例中的 PHRASE),则不会设置 $REPLY

只需将 IFS 变量设置为空:

while IFS= read -r var;
do
   echo "$var"
done < file

哪个returns:

$ while IFS= read -r var; do echo "$var"; done < file
xdebug
var_dump
 dump(
pwet
meuh
coin

来自How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?

IFS= prevents trimming of leading and trailing whitespace.

-r 按字面意思处理输入,但向 read 提供参数会导致根据 IFS 拆分行,其默认值为删除前导和尾随空格。正如 Tom Fenech 指出的那样,bash read 可以省略参数,未拆分的输出存储在 REPLY 中。如果您不想使用 REPLY,您可以简单地将 IFS 设置为空字符串以防止分词。

# all uppercase variable names are reserved for the shell;
# put at least one lowercase letter or number in your names
while IFS= read -r phrase; do
    echo "$phrase"
done < phrase_file