问题:用\n
用sed
替换一些正则表达式。
解决方案:有很多类似的答案[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'字符)
由于我没有找到任何与此相关的帖子,所以我认为我可能在这里误会了某件事...那么,它的真正作用是什么?为什么行得通?
答案 0 :(得分:1)
使用-z
会更改sed认为是一行的内容。 \n
保留为\n
,但它没有结束一行,但\0
会结束。由于seq
的输出中没有空字节,因此将整个输出视为一行,并在一次迭代中处理(即,用空格替换所有\n
)。