sed替换单字节文件中十六进制换行符无效,求解决思路
解决sed替换换行字节无效的问题
问题原因
sed是按行处理文本的工具,默认将\x0a(换行符)作为行分隔符。读取内容时,sed会自动剥离每行末尾的换行符,处理完成后再重新添加换行符输出。这就导致你的替换规则s/\x0a/\x25/g找不到匹配目标——sed处理的内容里已经没有换行符了。
解决思路
1. 使用tr命令(最推荐,简单直接)
tr是专门的字符转换工具,直接处理字节流,不会忽略换行符:
# 先转存到临时文件再替换原文件 tr '\x0a' '\x25' < saut-de-ligne_UTF-8 > temp_file && mv temp_file saut-de-ligne_UTF-8 # 若系统安装了moreutils包,可直接原地修改 tr '\x0a' '\x25' < saut-de-ligne_UTF-8 | sponge saut-de-ligne_UTF-8
2. 使用GNU sed的-z选项
GNU sed支持-z参数,将NUL字符作为行分隔符,这样整个文件会被当作单行读取,换行符会保留在处理内容中:
sed -z -i 's/\x0a/\x25/g' saut-de-ligne_UTF-8
注意:该特性仅GNU sed支持,BSD sed等其他版本无法使用。
3. 使用awk处理
通过设置记录分隔符(RS)为一个不会出现的字符(比如NUL),让awk把整个文件当作一个记录,即可匹配换行符:
awk -v RS='\x00' '{gsub(/\x0a/,"\x25"); print}' saut-de-ligne_UTF-8 > temp_file && mv temp_file saut-de-ligne_UTF-8
4. 使用perl处理
perl支持直接处理字节流并原地修改文件:
perl -pi -e 's/\x0a/\x25/g' saut-de-ligne_UTF-8
内容的提问来源于stack exchange,提问作者user10165777
相关产品推荐
相关产品推荐

