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

sed '/^$/d'

但我运气不佳。

例如,我有这样几行:

xxxxxx


yyyyyy


zzzzzz

我希望它是这样的:

xxxxxx
yyyyyy
zzzzzz

这个的代码应该是什么?


当前回答

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

ripgrep: Cat数据文件| rg '。'带空格的行被认为是非空的 cat datafile | rg '\S'行带空格被认为是空的 rg '\S'带空格的数据文件行被认为是空的(可以添加-N来删除在屏幕上显示的行号) sd 带空格的Cat数据文件| sd '^\n' "行被认为是非空的 带空格的Cat数据文件| sd '^\s*\n' "行被认为是空的 Sd '^\s*\n' "数据文件就地编辑

其他回答

我错过了awk的解决方案:

awk 'NF' file

这将返回:

xxxxxx
yyyyyy
zzzzzz

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

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

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

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

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

sed -E '/^$/d'

-E标志使sed捕获扩展正则表达式。更多信息请点击这里

使用vim编辑器删除空行

美元:% s / ^ \ n / / g

我的bash特定的答案是建议使用perl替换操作符与全局模式g标志,如下所示:

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

这个答案说明了计算空行中是否有空格([\]*),以及使用|分隔多个搜索词/字段。在macOS High Sierra和CentOS 6/7上测试。

仅供参考,OP的原始代码sed '/^$/d' $文件在高性能超级计算集群的macOS High Sierra和CentOS 6/7 Linux的bash Terminal中正常工作。