如何更换许多中间空行,每行只有一个空白行

时间:2010-07-17 07:22:27

标签: shell sed awk newline

我正在学习使用sed并有一个假设的要求:

bash$ cat states
California


Massachusetts


Arizona

Wisconsin

我想要输出:(基本上我只需要一个空行)

California

Massachusetts

Arizona

Wisconsin

请建议使用sed的方法。 它应该使用多线模式空间等概念吗?

谢谢,

Jagrati


在回复其中一条评论时,好的,我运行了一些测试脚本,而错误的假设是地址空间选择标准只应用一次。它似乎一次又一次被激活。

bash$ cat file 
a 
b 
c 
a 
b 
c 

bash$ sed -e '/a/,/b/s/$/x/g' file 
ax 
bx 
c 
ax 
bx 
c 

我的印象是它会产生:

ax 
bx 
c 
a 
b 
c

如果有逗号分隔的地址空间,有人可以解释一下sed是如何进行的。

5 个答案:

答案 0 :(得分:6)

尝试此操作将删除所有连续的空行

cat states | sed '/./,/^$/!d'

输出:

California

Massachusetts

Arizona

Wisconsin

答案 1 :(得分:2)

我知道OP明确要求使用sed和/或awk的解决方案,但问题也可以用cat解决:

cat -s file

否则,这是解决sed问题的另一种方法:

sed '/./!d; G' file

利用G将空行附加到文件中找到的所有非空行。

答案 2 :(得分:2)

这可以在没有sed的情况下完成,但也不符合您的学习要求sed

cat -s states

值得注意的是,在info sed中为GNU sed执行此操作的三个示例都比dalton'smarco's答案复杂得多。

这些版本压缩成一行:

sed ':x;/^\n*$/{N;bx};s/\n*/\n/' states

sed '1,/^./{/./!d};:x;/./!{N;s/^\n$//;tx}' states

sed -ne '/./!d;:x;p;n;/./bx;:z;n;/./!bz;i\ ' -e 'bx' states

答案 3 :(得分:1)

你也可以使用awk

$ cat file
California


Massachusetts


Arizona

Wisconsin

$ awk 'NF{print;print ""}'  file
California

Massachusetts

Arizona

Wisconsin

答案 4 :(得分:0)