如何在bash中用一个空行替换多个空行?

Nic*_*kiy 35 regex bash

我有一个包含以下内容的文件:

something



something else

something else again
Run Code Online (Sandbox Code Playgroud)

我需要一个bash命令,sed/grep我们将产生以下输出

something

something else

something else again
Run Code Online (Sandbox Code Playgroud)

换句话说,我需要用一个空白行替换多个空白行.grep/sed是基于行的.我从来没有找到适用于多行正则表达式模式的BASH解决方案.

mar*_*rco 78

对于BSD派生系统(包括GNU):

您只需要cat使用-s选项,使其从输出中删除重复的空行:

cat -s
Run Code Online (Sandbox Code Playgroud)

从手册页: -s --squeeze-blank: suppress repeated empty output lines.

  • @qodeninja当我使用Windows行结尾的文件时,它对我不起作用.也许这也可能是你的问题?当我将文件转换为Unix行结尾时,`cat -s`对我来说很好. (5认同)
  • 无论什么原因对我来说都不起作用`cat -s file1> file2` (4认同)
  • 请注意,它可以通过管道使用:`some_output | cat -s`. (2认同)

WKP*_*lus 18

我刚刚解决了这个问题sed.即使这是一个7岁的问题,有人可以在这里寻求帮助,所以我在sed这里写我的解决方案:

sed 'N;/^\n$/D;P;D;'
Run Code Online (Sandbox Code Playgroud)

  • `sed '$!N;/^\n$/{$q;D;};P;D;'` 防止在 OSX sed 上删除最后一行。也适用于 gnu sed。 (3认同)
  • 这对我很有用,因为它是sed,我可以使用-i进行就地修复. (2认同)
  • 奇怪的是,这也为我删除了文件的最后两行(在 OSX sed 上) (2认同)

big*_*mus 13

grep -A1 . <yourfile> | grep -v "^--$"
Run Code Online (Sandbox Code Playgroud)

这个grep解决方案可以假设您需要以下内容:

输入

line1

line2
line3


line4



line5
Run Code Online (Sandbox Code Playgroud)

产量

line1

line2
line3

line4

line5
Run Code Online (Sandbox Code Playgroud)

  • 实际上,弗里金很棒.一百万年后我不会想到这一点.干得好.一个_slightly_更健壮的版本当然是这样的(处理非空的空白行):grep -v -A1'^ [[:blank:]]*$'<file> | grep -v'^ - $' (3认同)

Can*_*der 11

实际上,如果用一个换行替换多个换行符,输出将是:

something
something else
something else again
Run Code Online (Sandbox Code Playgroud)

你可以通过以下方式实现:

sed /^$/d FILE
Run Code Online (Sandbox Code Playgroud)