读nul分隔的字段

时间:2015-04-27 00:08:08

标签: bash nul

鉴于此文件

printf 'alpha\0bravo\0charlie' > delta.txt

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

IFS= read mike november oscar < delta.txt
IFS=$'\0' read mike november oscar < delta.txt

但是字段没有正确分割

$ echo $mike
alphabravocharlie

2 个答案:

答案 0 :(得分:3)

分配IFS=$'\0'不会使空字符成为分隔符,因为Bash variables cannot hold null charactersIFS=$'\0'相当于IFS=,您可以通过执行以下操作进行验证:

bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0

根据定义,IFS=表示根本没有分词(请参阅Bash Reference Manual)。

您可以使用read builtin-d选项逐个读取空分隔项。根据链接文档,

  

-d delim

     

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

我们可以使用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 |

我知道逐一阅读是令人讨厌的,但我无法想到更好的事情。

答案 1 :(得分:1)

作为一种解决方法,我创建了这个函数

.parent

使用示例

function read_loop {
  while [ "$#" -gt 0 ]
  do
    read -d '' "$1"
    shift
  done
}