在文档中,它说-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$
我无法理解那个输出。究竟是怎么回事?
答案 0 :(得分:2)
-z
适用于输入以NUL分隔而非\n
- 分隔的情况。它改变cut
处理输入的方式,并使其以相同的格式输出记录,并以\0
行结尾。
您的输入数据现在是:
John Doe 28 New York\nBob Smith 37 Boston\nJane Doe 31 Boston\n
如果它有NUL而不是换行符,则您使用-z
:
John Doe 28 New York\0Bob Smith 37 Boston\0Jane Doe 31 Boston\0
这什么时候有用?对于文件而言,它不像管道那样多。例如,您可以使用find -print0
在每个名称后面输出\0
的文件名。 find -print0
允许您使用嵌入的换行符处理文件名 - 这是非常不寻常的,但换行符是文件名中的合法字符。 \0
永远不合法。
然后cut -z
会很有用。
其他命令中的类似标志包括xargs -0
,read -d ''
和cpio -0
。
答案 1 :(得分:1)
ASCII NULL
字符实际上是文件结尾。您的输入文件实际上包含:
John Doe\t28\tNew York\n
Bob Smith\t37\tBoston\n
Jane Doe\t31\tBoston\n
\0
(\n
是新行,\0
是ASCII NULL
,\t
是标签符。)
如果你的行分隔符是文件结尾,那么第一个字段将是“John Doe”(这是你所期望的),第三个字段是“New York\nBob Smith
”。此处\n
不是字段分隔符,因此该字段会运行到下一个标签。