首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取nul分隔字段

读取nul分隔字段
EN

Stack Overflow用户
提问于 2015-04-27 00:08:08
回答 2查看 512关注 0票数 4

给出这个文件

代码语言:javascript
复制
printf 'alpha\0bravo\0charlie' > delta.txt

我想将这些字段读入单独的变量中。我之所以使用空分隔符,是因为字段将包含文件路径,其中可以包含除null以外的任何字符。我试过以下命令:

代码语言:javascript
复制
IFS= read mike november oscar < delta.txt
IFS=$'\0' read mike november oscar < delta.txt

然而,字段没有被正确地分割。

代码语言:javascript
复制
$ echo $mike
alphabravocharlie
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-27 01:43:00

作为解决办法,我创建了这个函数

代码语言:javascript
复制
function read_loop {
  while [ "$#" -gt 0 ]
  do
    read -d '' "$1"
    shift
  done
}

示例使用

代码语言:javascript
复制
read-nul mike november oscar < delta.txt
票数 1
EN

Stack Overflow用户

发布于 2015-04-27 01:41:29

赋值IFS=$'\0'不会使空字符成为分隔符,因为Bash变量不能容纳空字符。IFS=$'\0'等同于IFS=,您可以通过以下操作进行验证:

代码语言:javascript
复制
bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0

根据定义,IFS=意味着根本不分裂单词(参见Bash参考手册)。

您可以使用-d选项逐个读取空分隔项。根据相关文件,

-d delim delim的第一个字符用于终止输入行,而不是换行符。

我们可以为delim使用一个空字符串来获得所需的行为。

示例(我冒昧地向您的示例添加了空格,以演示它如何实现所需内容-在空白上不分割):

代码语言:javascript
复制
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 |

我知道一个一个地读书很烦人,但我想不出更好的办法了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29885176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档