【问题标题】:Sed: replacing newlines with "-z"?Sed:用“-z”替换换行符?
【发布时间】:2019-03-03 10:30:14
【问题描述】:

问题:用\n 替换一些正则表达式sed

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

也就是说…… 在 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’ 字符)

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

【问题讨论】:

    标签: sed


    【解决方案1】:

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

    【讨论】:

    • 我不太明白您对NUL 字符的回答。它没有指定输入必须有这个字符。我从中了解到的是,它将在每个字符串的末尾放置一个\0 字符,同时将每一行视为事物。那么,文档是错误的,还是只是我的理解?
    • 你的理解是错误的。 sort -zfind -print0 添加 \0 字符,sed -z 只是将 \0 视为行尾标记,而不是默认的 \n
    • @yZaph Sed 只看到一个字节流,默认情况下,\n 字节被认为是行尾的标记。使用-z,sed 会寻找\0 字节来表示行结束,而\n 被视为任何其他字符。我认为您认为它将采用换行符分隔的字符串并将\n 替换为\0,但事实并非如此。
    • 哦。我知道了。我现在明白了。谢谢你们。
    • 来了解 sed 中的这个 -z 选项。这是一个很好的解释
    猜你喜欢
    • 2016-10-29
    • 2018-01-21
    • 2010-11-29
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    相关资源
    最近更新 更多