You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac下BSD sed文本处理:将3个以上换行替换为2个的方法

解决Mac上BSD sed替换重复内容及多行换行的问题

我明白你的困扰,Mac自带的BSD sed和Linux的GNU sed语法差异确实容易踩坑,咱们一步步来解决,先搞定测试用的bla替换,再处理换行符的需求。

一、测试:替换3个及以上重复的"bla"为"BLA"

BSD sed要使用扩展正则表达式,得加-E参数(和GNU sed的-r不同,这里要注意区分),具体命令如下:

查看替换效果(不修改原文件)

sed -E 's/(bla){3,}/BLA/g' stupid.txt
  • -E:启用扩展正则,让{3,}这种重复次数语法生效
  • (bla){3,}:匹配连续3次及以上的"bla"
  • g:全局替换,一行里所有符合条件的内容都会被替换

直接修改原文件(原地编辑)

BSD sed的-i参数必须指定备份后缀(哪怕是空的),如果不想保留备份文件,就用空字符串:

sed -i '' -E 's/(bla){3,}/BLA/g' stupid.txt

二、替换3个及以上换行符为2个换行符

因为sed默认按行处理,换行符是行分隔符,所以需要把整个文件读入模式空间后再处理,BSD sed的写法如下:

查看替换效果

sed -E ':a;N;$!ba;s/\n{3,}/\n\n/g' stupid.txt
  • :a:定义一个名为a的标签,用于循环跳转
  • N:把下一行内容读入当前模式空间,实现多行合并
  • $!ba:如果不是最后一行($!),就跳转到标签a,直到把整个文件都读进模式空间
  • s/\n{3,}/\n\n/g:把所有连续3个及以上的换行符替换成2个换行

原地编辑原文件

同样加上-i ''参数:

sed -i '' -E ':a;N;$!ba;s/\n{3,}/\n\n/g' stupid.txt

备选方案:用awk实现(可能更直观)

如果觉得sed的多行处理有点绕,awk也是个不错的选择,代码更简洁:

查看替换效果

awk -v RS='\n{3,}' -v ORS='\n\n' '1' stupid.txt
  • -v RS='\n{3,}':把记录分隔符设为3个及以上的换行
  • -v ORS='\n\n':把输出记录分隔符设为2个换行
  • 1:awk的简写,等价于print,会打印每个分割后的记录

原地编辑原文件

awk没有直接的原地编辑参数,可以先输出到临时文件再替换原文件:

awk -v RS='\n{3,}' -v ORS='\n\n' '1' stupid.txt > temp.txt && mv temp.txt stupid.txt

注意:不管用sed还是awk,建议先不加原地编辑参数,确认输出符合预期后,再修改原文件哦!

内容的提问来源于stack exchange,提问作者rrr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:11:26