Sed:用“ -z”替换换行符吗?

时间:2018-09-27 13:27:23

标签: sed

问题:用\nsed替换一些正则表达式。

解决方案:有很多类似的答案[1] [2] [3] [4],还有许多其他我不会链接的链接。所有这些都建议您创建一个新标签:a,合并行N,如果不是文件结尾:a,则分支到$!ba,然后执行一些命令。

话说... 在GNU sed手册中,有-z选项:

-z
--null-data
--zero-terminated

Treat the input as a set of lines, each terminated by a zero byte
(the ASCII ‘NUL’ character) instead of a newline. This option can
be used with commands like ‘sort -z’ and ‘find -print0’ to process
arbitrary file names. 

因此,首先,出于比较的原因,如果我们尝试幼稚的方法:

$ seq 3 | sed 's/\n/ /g'
1
2
3

但是,使用此-z选项:

$ seq 3 | sed -z 's/\n/ /g'
1 2 3

真正的问题:为什么?

鉴于它“合并”了文档中指定的所有行,我希望我将不得不使用\0而不是\n,因为:

  

将输入视为一组行,每行以一个零字节结尾   (ASCII'NUL'字符)

由于我没有找到任何与此相关的帖子,所以我认为我可能在这里误会了某件事...那么,它的真正作用是什么?为什么行得通?

1 个答案:

答案 0 :(得分:1)

使用-z会更改sed认为是一行的内容。 \n保留为\n,但它没有结束一行,但\0会结束。由于seq的输出中没有空字节,因此将整个输出视为一行,并在一次迭代中处理(即,用空格替换所有\n)。