sed删除空行(包括由空格组成的空行)
sed实战之——删除空行(包括由空格组成的空行)
首先要隆重介绍我们的测试文件,因为这是非常特殊的文件:
forrest@ubuntu:~/Public$ cat -v wuhui.txt
1^M
^M
2^M
^M
3^M
^M
4^M
^M
5^M
^M
6^M
^M
^M
我用cat -v选项,显示不可见字符。^M是换行的意思。不过这是不正常的。正常的文件换行符用-v也是看不到的。
这里如下四种空行:
1、单独一个换行符
2、N个空格+换行
3、N个TAB+换行
4、N个(空格&TAB)+换行
对于这个文件,如果使用:
forrest@ubuntu:~/Public$ sed /^$/d wuhui.txt
1
2
3
4
5
6
forrest@ubuntu:~/Public$
是没有效果的。因为由于特殊字符的存在,空行并不是真的空行(^$)。Google了一下,可以使用这个命令来匹配:
forrest@ubuntu:~/Public$ sed /^[[:space:]]*$/d wuhui.txt
1
2
3
4
5
6
forrest@ubuntu:~/Public$
[[:space:]]表示空格或者tab的集合,这里有点意外的是居然匹配了^M这个不可见的换行符号。另外,注意到[[:space:]]后面跟着一个*,表示匹配0个或多个。
[[:space:]]可以用\s表示,如下:
forrest@ubuntu:~/Public$ sed '/^\s*$/d' wuhui.txt
1
2
3
4
5
6
forrest@ubuntu:~/Public$
但是使用转义字符,一定要对命令添加引号:
forrest@ubuntu:~/Public$ sed /^\s*$/d wuhui.txt
1
2
3
4
5
6
forrest@ubuntu:~/Public$