在 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
我需要遍历 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