使用sed替换日志中的点为换行符出错,求正确实现方法
问题描述
原始日志内容如下:
DATE-2025-04-10.UTO244234 DATE-2025-04-09.UTO244231 DATE-2025-04-11.UTO244231 DATE-2025-04-06.UTO244222 DATE-2025-04-20.UTO142222
需要将每行中的点(.)替换为换行符,得到如下输出:
DATE-2025-04-10 UTO244234 DATE-2025-04-09 UTO244231 DATE-2025-04-11 UTO244231 DATE-2025-04-06 UTO244222 DATE-2025-04-20 UTO142222
尝试使用命令 sed -i 's/./\n/g' 时,所有字符都被替换成了换行符,求正确实现方法。
解决方案
出错的核心原因是:正则表达式里的.是通配符,会匹配任意单个字符,所以原命令把每一个字符都换成了换行符。要匹配实际的点,必须用反斜杠转义成 \.。
正确的sed命令
GNU sed(Linux系统默认)
直接用转义后的点做替换:
sed -i 's/\./\n/g' 你的日志文件名
如果需要备份原文件(生成.bak后缀的备份),可以加参数:
sed -i.bak 's/\./\n/g' 你的日志文件名
BSD sed(macOS系统默认)
BSD sed对换行符的处理有差异,需要用$'\\n'表示换行:
sed -i '' 's/\./\'$'\n/g' 你的日志文件名
或者直接把换行符写入命令:
sed -i '' 's/\./\ /g' 你的日志文件名
其他替代方法
如果不想纠结sed版本差异,也可以用awk实现:
awk '{gsub(/\./,"\n"); print}' 你的日志文件名 > 新日志文件名
或者用tr命令(仅适合单字符替换场景):
tr '.' '\n' < 原日志文件名 > 新日志文件名
内容的提问来源于stack exchange,提问作者Stt4e
相关产品推荐
相关产品推荐

