我试图使用sed删除空行:
sed '/^$/d'
但我没有运气。
例如,我有这些行:
xxxxxx
yyyyyy
zzzzzz
我希望它像:
xxxxxx
yyyyyy
zzzzzz
应该是什么代码?
您的“空”行可能包含空格或制表符。使用POSIX classes和sed
删除仅包含空格的所有行:
sed '/^[[:space:]]*$/d'
使用ERE的较短版本,例如使用gnu sed:
sed -r '/^\s*$/d'
(注意sed不支持PCRE。)
您很可能会看到意外行为,因为您的文本文件是在Windows上创建的,因此行序列的结尾是\r\n
。在运行sed或use之前,可以使用dos2unix将其转换为UNIX样式的文本文件
sed -r "/^\r?$/d"
无论是否有回车,都要删除空白行。
我的bash
特定的答案是建议使用perl
替换运算符和全局模式g
标志,如下所示:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
这个答案说明了空行是否有空格([\ ]*
),以及使用|
来分隔多个搜索词/字段。在macOS High Sierra和CentOS 6/7上测试。
仅供参考,OP的原始代码sed '/^$/d' $file
在macOS High Sierra的bash
终端和高性能超级计算集群的CentOS 6/7 Linux上运行良好。
对于使用FreeBSD 10.1和sed的我只使用这个解决方案:
sed -e '/^[ ]*$/d' "testfile"
在[]
里面有空格和制表符号。
测试文件包含:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============
我错过了awk
解决方案:
awk 'NF' file
哪个会回归:
xxxxxx
yyyyyy
zzzzzz
这是如何运作的?由于NF
代表“字段数”,那些空的行有0个fiedls,因此awk将0计算为False并且没有打印行;但是,如果至少有一个字段,则评估为True并使awk
执行其默认操作:打印当前行。
sed '/^$/d'
应该没问题,您是否希望修改文件?如果是这样,你应该使用-i
标志。
也许那些线不是空的,所以如果是这样的话,看看这个问题Remove empty lines from txtfiles, remove spaces from start and end of line我相信这就是你想要实现的目标。
我相信这是最简单,最快的一个:
cat file.txt | grep .
如果你需要忽略所有的空格行,那么试试这个:
cat file.txt | grep '\S'
例:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
输出
7
5
在接受的答案here和上面接受的答案的帮助下,我使用了:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
这涵盖了所有基础,完美地满足了我的需求。感谢@Kent和@kev的原创海报
你可以说:
sed -n '/ / p' filename #there is a space between '//'
您也可以使用“grep”执行类似的操作:
egrep -v "^$" file.txt
这也适用于awk。
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz