2

我有一个输出一些文件路径的函数,我需要这些路径由 NUL 字符而不是换行符分隔\n。我尝试了以下代码:

function myfunc
{
  declare -a DUPS
  # some commands to fill DUPS with appropriate file/folder paths
  ( for i in "${DUPS[@]}"; do echo "$i"; done )|sort|uniq|awk 'BEGIN{ORS="\x00";} {print substr($0, index($0, $2))}'
}

但是,如果我将其输出通过管道传输到hexdumpor hd,则不会显示 NUL 字符。输出中似乎不包含 NUL 字符awk

myfunc | hd

将打印:

00000000  2f 70 61 74 68 2f 6e 75  6d 62 65 72 2f 6f 6e 65  |/path/number/one|
00000010  2f 2f 70 61 74 68 2f 6e  75 6d 62 65 72 2f 74 77  |//path/number/tw|
00000020  6f 2f 2f 70 61 74 68 2f  6e 75 6d 62 65 72 2f 74  |o//path/number/t|
00000030  68 72 65 65 2f                                    |hree/|
00000035

我的awk版本是:

~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040

对于我来说,任何带有其他命令的解决方案sed也可以接受。
注意:我的问题与enter link description here不重复,因为它要求提供一种适用于具有不同awks 的不同机器的解决方案。但我只需要一个可以在我自己的机器上运行的解决方案,所以我可以使用任何awk可以安装在 Ubuntu 14.04 上的版本。

4

1 回答 1

2

Gnu awk v4.0.1 与您的原始程序配合得很好,但我使用的所有其他 awk (mawkoriginal-awk)busybox awk产生与您似乎正在经历的相同的无 NUL 输出。似乎使用这些 awk,使用 print 或 printf 打印带有嵌入 NUL 的字符串会导致 NUL 被视为字符串终止符。

但是,mawk如果original-awk您使用printf "%s",0;. 因此,如果您使用其中之一,则可以将 ORS 设置为空字符串并添加{printf "%s", 0;}到 awk 程序的末尾。(如果您的 awk 程序使用 ,您将需要其他更具侵入性的修改next)。

我不知道有什么方法可以说服busybox awk打印一个 NUL 字节,所以如果这是你正在使用的,你可能要考虑选择一个真正的 awk。

于 2015-08-30T04:41:27.393 回答