为什么sed命令's/\n/\000/g'无法将换行符替换为null字符?
sed命令替换换行符未生效的原因
核心原因
sed默认采用逐行读取的处理逻辑:
- 读取文件时会自动剔除每行末尾的换行符,再将剩余内容放入模式空间执行匹配替换规则
- 单条行处理完成后,输出时会自动在内容末尾补回换行符
所以你写的s/\n/\000/g规则执行时,模式空间里根本不存在换行符,自然匹配不到任何内容,也就不会做替换,最终输出的换行符都是sed处理结束后自动补加的,和原文件的换行符没有关系。
实现换行符替换为null字符的正确方案
你可以从两种方法里选适合的:
方法1:使用GNU sed的-z参数调整行分隔符
-z参数会让sed以null字符而非换行符作为行分隔符,此时整个文件的所有内容(包括所有换行符)都会被一次性读入模式空间,就可以正常匹配替换换行符:
sed -z 's/\n/\x00/g' /tmp/xxx | od -xc
方法2:使用tr命令做单字符替换
单字符替换的场景更适合用tr命令实现,语法更简单执行效率也更高:
tr '\n' '\0' < /tmp/xxx | od -xc
内容的提问来源于stack exchange,提问作者user939857
相关产品推荐
相关产品推荐

