简单任务 - 将多个连续的空行合并成一个空行。来自一个实际问题:打印一个很长的 RFC 文档,希望能省一些纸张。
很久以前就遇到过这个问题,因为发现 sed 不能匹配 '\n',当时的解法是写了个 shell 脚本处理。Vim 可以用 '\n' 匹配换行符,解决方案是:
vim '+%s/^\n\+/\r/g' +x rfc.txt
考虑空行上可以有空白字符的话,还能再完善一点:
vim '+%s/^\(\s*\n\)\+/\r/g' +x rfc.txt
这是目前的“最佳应法”,欢迎提供更佳的解法。
特别鸣谢:刚开始缺少 '^' 怎么都不能成功,经老婆指正方才解决。你怎么也想不到,我老婆作为一个文科生,竟然能把 vim 使得出神入化,还在她们公司内部做了一个四十分钟的讲座!
3 Comments so far
gavinzhm, on Jan 8, 2009 at 8:11am, said:
试试这个行不
sed '/^$/{N;/^\n*$/D}' ufile
mattw, on Jan 9, 2009 at 10:33pm, said:
受教了,居然加上 $ 就可以匹配到 \n 了。
mattw, on Jan 23, 2009 at 7:16am, said:
仔细读了手册,总算理解了这个命令。
sed '/^$/{N;/^\n$/D}' inputfile即可,\n 后的星号不必要,因为 D 命令应用之后会将控制转到脚本开头(接着 N)。