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

yZa*_*aph 4 sed

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

解决方法:类似的答案有很多[ 1 ][ 2 ][ 3 ][ 4 ],还有很多其他的链接我就不链接了。他们都建议你创建一个新标签:a,合并行N,分支到:aif not end-of-file $!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. 
Run Code Online (Sandbox Code Playgroud)

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

$ seq 3 | sed 's/\n/ /g'
1
2
3
Run Code Online (Sandbox Code Playgroud)

但是,使用此-z选项:

$ seq 3 | sed -z 's/\n/ /g'
1 2 3
Run Code Online (Sandbox Code Playgroud)

真正的问题:为什么?

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

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

由于我没有找到任何相关的帖子,我想我可能在这里误解了一些东西......那么,它到底有什么作用?为什么有效?

cho*_*oba 5

使用-z更改 sed 认为是一行的内容。\n遗骸\n,但它并没有结束的线,但空字符(它被表示为\x0在SED)会。由于在 的输出中没有空字节seq,整个输出被视为一行并在单次迭代中处理(即用\n空格替换所有的)。

  • @yZaph Sed 只看到字节流,默认情况下,`\n` 字节被认为标记行的结尾。使用“-z”,sed 会查找“\0”字节来表示行结束,而“\n”则像任何其他字符一样对待。我认为您假设它将采用换行符分隔的字符串并将“\n”替换为“\0”,但事实并非如此。 (2认同)