您如何为 "cut" 命令使用 -z 选项?

How exacly do you use the -z option for the "cut" command?

在文档中它说 -z 选项将默认行定界符(换行符)更改为 ASCII NUL。您究竟如何使用该选项?请看看这个例子(文件是制表符分隔的):

$ cat data.tsv 
John Doe    28  New York
Bob Smith   37  Boston
Jane Doe    31  Boston
$
$ cut -f1,3 data.tsv 
John Doe    New York
Bob Smith   Boston
Jane Doe    Boston
$
$ # This is the output I get:
$ cut -f1,3 -z data.tsv 
John Doe    New York
Bob Smith$

我无法理解该输出。那里到底发生了什么?

-z 适用于当您的 输入 是 NUL 分隔而不是 \n 分隔时。它改变了 cut 处理输入的方式,并使其以相同的格式输出记录,具有 [=15=] 行结尾。

您现在输入的数据是:

John Doe    28  New York\nBob Smith   37  Boston\nJane Doe    31  Boston\n

如果它有 NUL 而不是换行符,你会使用 -z:

John Doe    28  New York[=11=]Bob Smith   37  Boston[=11=]Jane Doe    31  Boston[=11=]

这什么时候有用?它不是用于文件,而是用于管道。例如,您可以使用 find -print0 输出每个名称后带有 [=15=] 的文件名。 find -print0 允许您处理带有嵌入换行符的文件名——这是非常不寻常的,但换行符是文件名中的合法字符。 [=15=] 永远不合法。

那么cut -z就有用了。

其他命令中的类似标志包括 xargs -0read -d ''cpio -0

ASCII NULL 字符实际上是文件结尾。您的输入文件实际包含:

John Doe\t28\tNew York\n
Bob Smith\t37\tBoston\n
Jane Doe\t31\tBoston\n
[=10=]

\n 是新行,[=13=] 是 ASCII NULL\t 是制表符)。

如果您的行分隔符是文件结尾,那么第一个字段将是 "John Doe"(这是您所期望的),第三个字段是“New York\nBob Smith”。 \n 在这里不是字段分隔符,因此该字段运行到下一个选项卡。