如何在 bash\n\n
中用空\0
字符替换两个换行符,反之亦然?
我看到td
可以用 null 替换单个换行符,但不能替换两个连续的换行符。我试过sed
了,但似乎不可能。sed
似乎“基于行”并且不喜欢弄乱换行符。
我想要这样做的原因是能够使用sort -z
. 例如,给定一个文件
record b
foo bar
record a
zee bee
dee da
我想将该文件通过管道转换为将空行替换为 null,然后转换为sort -z
,然后将 null 替换为空行,最后将其吐出
record a
zee bee
dee da
record b
foo bar
您无需为 0 作为分隔符而苦苦挣扎。让我们改用 255(十六进制 FF):
结果:
注意:以上假设您的行尾是 Linux (LF),而不是 Windows (CR+LF) 或 Mac (CR)。如果您希望它与任何类型的行结尾一起工作,那么我们将不得不稍微修改脚本。
初步说明
标题询问您尝试的解决方案;您在问题正文中描述了真正的问题。比较XY 问题。这个答案并不完全是“用 null 替换空行,反之亦然”,所以它不能解决标题。它在正确的位置注入空字节,然后删除它们(因为我认为它更容易),这样它就解决了主体问题。
解决方案
让我们调整一下我的另一个答案:按字母顺序排序行包。您的问题几乎与我回答的问题重复。
在那里,每条记录都以像
[ProfileX]
. 在您的情况下,我们可以说空行是这样的标题,但第一条记录错过了它。要使用链接解决方案,我们需要预先添加第一个标题,并在最后删除第一个标题。如果不进行此修改,输入中的第一条记录将出现在输出中,并且之前没有任何空行;这将是一个问题,除非它是输出中的第一条记录。并且输出中的第一条记录将在其前面有其标题(如果有的话);这将是一个问题,除非它是输入的第一条记录(没有标题的记录)。