给出这个文件
printf 'alpha\0bravo\0charlie' > delta.txt我想将这些字段读入单独的变量中。我之所以使用空分隔符,是因为字段将包含文件路径,其中可以包含除null以外的任何字符。我试过以下命令:
IFS= read mike november oscar < delta.txt
IFS=$'\0' read mike november oscar < delta.txt然而,字段没有被正确地分割。
$ echo $mike
alphabravocharlie发布于 2015-04-27 01:43:00
作为解决办法,我创建了这个函数
function read_loop {
while [ "$#" -gt 0 ]
do
read -d '' "$1"
shift
done
}示例使用
read-nul mike november oscar < delta.txt发布于 2015-04-27 01:41:29
赋值IFS=$'\0'不会使空字符成为分隔符,因为Bash变量不能容纳空字符。。IFS=$'\0'等同于IFS=,您可以通过以下操作进行验证:
bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0根据定义,IFS=意味着根本不分裂单词(参见Bash参考手册)。
您可以使用-d选项逐个读取空分隔项。根据相关文件,
-d delimdelim的第一个字符用于终止输入行,而不是换行符。
我们可以为delim使用一个空字符串来获得所需的行为。
示例(我冒昧地向您的示例添加了空格,以演示它如何实现所需内容-在空白上不分割):
bash-4.3$ printf 'alpha with whitespace\0bravo with whitespace\0charlie with whitespace' > delta.txt
bash-4.3$ { read -r -d '' mike; IFS= read -r -d '' november; IFS= read -r -d '' oscar; echo $mike; echo $november; echo $oscar; } < delta.txt
alpha with whitespace
bravo with whitespace
charlie with whitespace我还使用-r选项来保留输入文件中的反斜杠。当然,您可以在开始时将< delta.txt替换为cat delta.txt |。
我知道一个一个地读书很烦人,但我想不出更好的办法了。
https://stackoverflow.com/questions/29885176
复制相似问题