给定这个文件
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
分配IFS=$'\0'
不会使空字符成为分隔符,因为Bash 变量不能包含空字符 https://stackoverflow.com/questions/6570531/assign-string-containing-null-character-0-to-a-variable-in-bash. IFS=$'\0'
相当于IFS=
,您可以通过执行以下操作来验证:
bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0
And IFS=
根据定义意味着根本没有分词(参见Bash 参考手册 https://www.gnu.org/software/bash/manual/bash.html#Word-Splitting).
您可以做的是使用以下命令逐一读取空分隔项-d
的选项read builtin https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins。根据链接的文档,
-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
with a cat delta.txt |
一开始。
我知道一页一页地阅读很烦人,但我想不出更好的办法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)