首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用空字节作为分隔符,用参数的位置号连接每个参数?

使用空字节作为分隔符,用参数的位置号连接每个参数?
EN

Stack Overflow用户
提问于 2018-06-04 14:14:02
回答 3查看 63关注 0票数 0

我想用参数的位置数加入每个参数。我希望只使用空字节作为分隔符。

以下是我想做的事:

代码语言:javascript
复制
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循环(因为它很难看),并使用管道和/或进程替换。所以问题是:如何使用空字节作为分隔符连接两个空字节分隔的流。我试过使用粘贴:

代码语言:javascript
复制
printf '%s\x00' "$@" | paste -z -d '\0' <(seq $# | tr '\n' '\0') -

但使用-d'\0'调用粘贴时,粘贴将根本不插入任何润色器。粘贴使用选项卡,而不指定润色仪。有什么方法可以让粘贴使用空字节作为列标记吗?这里还有另一种实用工具吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-04 15:48:50

为了完整起见,一个非循环结构只使用printf (但两次使用它):

代码语言:javascript
复制
printf "$(printf '%d\\000%%s\\000' $(seq $#))" "$@"

内部printf创建一个由序列号预先填充的格式字符串。为了防止插入字符串开始时的数字被合并到转义代码中,\000是必要的。

票数 1
EN

Stack Overflow用户

发布于 2018-06-04 14:28:22

循环不是问题所在,而是您对循环的使用。

代码语言:javascript
复制
f () {
  local i
  for ((i=1; i<=$#; i++)); do
    printf '%d\0%s\0' "$i" "${!i}"
  done
}

或者有可能

代码语言:javascript
复制
f () {
  i=1
  for arg; do
    printf '%d\0%s\0' "$((i++))" "$arg"
  done
}

它将在任何POSIX中工作,尽管它覆盖了全局i

票数 1
EN

Stack Overflow用户

发布于 2018-06-04 14:43:16

loop answer by Chepner使用起来非常简单,而且肯定会处理丑问题。

就像这里的另一种方法一样,可以不使用循环来实现它:

代码语言:javascript
复制
paste -zd $'\01' <(seq $# | tr '\n' '\0') <(printf '%s\0' "$@") | tr '\1' '\0'

这个paste命令粘贴两个流,其中\01作为列分隔符,最后一个tr命令将\01转换为\0 (NUL)字节。

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

https://stackoverflow.com/questions/50682628

复制
相关文章

相似问题

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