使用空字符作为分隔符连接作为参数传递的字符串

使用空字符作为分隔符连接作为参数传递的字符串

我正在寻找一个 CLI 工具,它接受任意数量的参数 $a、$b、$c、$d 等,并写入$a"\0"$b"\0"$c"\0"$d标准输出。是否有一个标准工具可以做到这一点,我可以在 CLI 上的管道的开头使用它?我的实现echo似乎不允许自定义分隔符。

答案1

printf可以解决这个问题,几乎:

printf "%s\0" "$a" "$b" "$c" ...

printf根据需要重复其格式字符串,在本例中每个参数重复一次,因此最终会得到每个参数后跟一个空字节。

要删除最后一个空字节,请使用 GNU head

printf "%s\0" "$a" "$b" "$c" ... | head -c-1

Zsh 的内置函数print也可以做到这一点,无需后期处理:

print -rNn "$a" "$b" "$c" ...

(-r禁用转义处理,-N打印由空字节分隔和终止的参数,-n禁用终端换行符。谢谢钢铁起子给小费!)

答案2

printf命令将根据需要重复该格式,因此我们可以这样做

print "%s\0"

我们可以看到它的实际效果:

$ printf "%s\0" hello there | hdump -8                   
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00               ere.

$ printf "%s\0" hello there everyone out there | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65 00      .there.

请注意,它还会在字符串末尾放置一个终结符 NUL。如果您不希望这样,我们可以将其删除,例如sed 's/.$//'

$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65         .there

相关内容