使用sed删除空行

我正在尝试使用sed删除空行:

sed '/^$/d'

但我运气不佳。

例如,我有这样几行:

xxxxxx




yyyyyy




zzzzzz

我希望它是这样的:

xxxxxx
yyyyyy
zzzzzz

这个的代码应该是什么?

647413 次浏览

sed '/^$/d'应该是好的,你期望修改文件到位吗?如果是这样,你应该使用-i标志。

也许这些行不是空的,所以如果是这样的话,看看这个问题删除txtfiles中的空行,删除行首和行尾的空格,我相信这是你想要达到的。

在“空”行中可能有空格或制表符。使用POSIX类sed删除所有只包含空格的行:

sed '/^[[:space:]]*$/d'

一个使用ERE的短版本,例如gnu sed:

sed -r '/^\s*$/d'

(注意sed的支持PCRE。)

你可以说:

sed -n '/ / p' filename    #there is a space between '//'

在接受答案在这里和上面接受答案的帮助下,我使用了:

$ 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

这涵盖了所有的基础,完美地满足了我的需求。向最初的海报致敬@肯特和@凯文

你也可以使用"grep"来做类似的事情:

egrep -v "^$" file.txt

我相信这是最简单和最快的方法:

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

我错过了awk解决方案:

awk 'NF' file

这将返回:

xxxxxx
yyyyyy
zzzzzz

这是如何工作的呢?由于NF代表“字段的数量”,那些空行的字段为0,因此awk将0计算为False,并且不打印任何行;但是,如果至少有一个字段,则求值为True,并使awk执行默认操作:打印当前行。

这也适用于awk。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz

您很可能会看到意想不到的行为,因为您的文本文件是在Windows上创建的,因此行序列的结束是\r\n。在运行sed或use之前,可以使用dos2unix将其转换为UNIX样式的文本文件

sed -r "/^\r?$/d"

无论回车符是否存在,都要删除空行。

对我来说,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 =============

我的__abc0特定的答案是建议使用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和CentOS 6/7 Linux的高性能超级计算集群上的bash终端上工作得很好。

另一个选项没有sedawkperl

strings $file > $output

字符串-打印文件中可打印字符的字符串。

使用vim编辑器删除空行

:%s/^$\n//g

您正在尝试的命令是正确的,只需使用-E标志。

sed -E '/^$/d'

-E标志使sed捕获扩展正则表达式

NF是awk的命令,用于删除文件中的空行 awk NF filename 通过使用sed sed -r "/^\r?$/d" < / p >

如果你想使用现代Rust工具,你可以考虑:

    <李> ripgrep:
    • 带有空格的cat datafile | rg '.'行被认为是非空的
    • 带有空格的cat datafile | rg '\S'行被认为是空的
    • 带有空格的rg '\S' datafile行被认为是空的(-N可以用来删除行号以便在屏幕上显示)
  • sd
    • 带有空格的cat datafile | sd '^\n' ''行被认为是非空的
    • 带有空格的cat datafile | sd '^\s*\n' ''行被认为是空的
    • sd '^\s*\n' '' datafile inplace编辑