我想用参数的位置数加入每个参数。我希望只使用空字节作为分隔符。
以下是我想做的事:
f() {
for ((i=1;i<$(($#+1));++i)); do
echo -n "$i"
echo -ne "\x00"
echo -n "${!i}"
echo -ne "\x00"
done
}
f a b c | hexdump -C
00000000 31 00 61 00 32 00 62 00 33 00 63 00 |1.a.2.b.3.c.|
0000000c但是,我希望删除for循环(因为它很难看),并使用管道和/或进程替换。所以问题是:如何使用空字节作为分隔符连接两个空字节分隔的流。我试过使用粘贴:
printf '%s\x00' "$@" | paste -z -d '\0' <(seq $# | tr '\n' '\0') -但使用-d'\0'调用粘贴时,粘贴将根本不插入任何润色器。粘贴使用选项卡,而不指定润色仪。有什么方法可以让粘贴使用空字节作为列标记吗?这里还有另一种实用工具吗?
发布于 2018-06-04 15:48:50
为了完整起见,一个非循环结构只使用printf (但两次使用它):
printf "$(printf '%d\\000%%s\\000' $(seq $#))" "$@"内部printf创建一个由序列号预先填充的格式字符串。为了防止插入字符串开始时的数字被合并到转义代码中,\000是必要的。
发布于 2018-06-04 14:28:22
循环不是问题所在,而是您对循环的使用。
f () {
local i
for ((i=1; i<=$#; i++)); do
printf '%d\0%s\0' "$i" "${!i}"
done
}或者有可能
f () {
i=1
for arg; do
printf '%d\0%s\0' "$((i++))" "$arg"
done
}它将在任何POSIX中工作,尽管它覆盖了全局i。
发布于 2018-06-04 14:43:16
loop answer by Chepner使用起来非常简单,而且肯定会处理丑问题。
就像这里的另一种方法一样,可以不使用循环来实现它:
paste -zd $'\01' <(seq $# | tr '\n' '\0') <(printf '%s\0' "$@") | tr '\1' '\0'这个paste命令粘贴两个流,其中\01作为列分隔符,最后一个tr命令将\01转换为\0 (NUL)字节。
https://stackoverflow.com/questions/50682628
复制相似问题