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
相关产品推荐
相关产品推荐

