如何找到连续的空白行并将它们转换为一行

zhu*_*wei 3 shell awk

我有一个文件 - 一个,并且存在一些继续空行(多个),见下文:

cat a
1

2


3



4

5
Run Code Online (Sandbox Code Playgroud)

所以首先我想知道是否存在继续空行,我试过了

cat a | grep '\n\n\n'
Run Code Online (Sandbox Code Playgroud)

没什么输出.所以我必须使用以下方式

vi a 
:set list
/\n\n\n
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否存在其他shell命令可以轻松实现这个?然后,如果存在两个或更多的空行我想将它们转换为一个?见下文

1

2

3

4

5
Run Code Online (Sandbox Code Playgroud)

起初我试过下面的shell

sed 's/\n\n\(\n\)*/\n\n/g' a
Run Code Online (Sandbox Code Playgroud)

它不起作用,然后我尝试了这个shell

cat a | tr '\n' '$' | sed 's/$$\(\$\)*/$$/g' | tr '$' '\n'
Run Code Online (Sandbox Code Playgroud)

这次它有效.而且我想知道是否存在其他方式可以实现这一点?

Sun*_*eep 6

好吧,如果你的cat实现支持

   -s, --squeeze-blank
          suppress repeated empty output lines
Run Code Online (Sandbox Code Playgroud)

那就简单了

$ cat -s a
1

2

3

4

5
Run Code Online (Sandbox Code Playgroud)

此外,编号行-s-n编号行也可以使用less命令.

注释:不会抑制仅包含空格的行.

如果您cat不支持,-s那么您可以使用:

awk 'NF||p; {p=NF}'
Run Code Online (Sandbox Code Playgroud)

或者如果你想在每条记录后保证一个空行,包括在输出结尾,即使输入中没有,那么:

awk -v RS= -v ORS='\n\n' '1'
Run Code Online (Sandbox Code Playgroud)

如果您的输入包含所有空白行的行,并且您希望它们像非空白行一样被处理(如同cat -s,请参阅下面的注释),然后:

awk '/./||p; {p=/./}'
Run Code Online (Sandbox Code Playgroud)

并保证输出结尾处有一个空行:

awk '/./||p; {p=/./} END{if (p) print ""}'
Run Code Online (Sandbox Code Playgroud)

  • 有几个,例如`cat -n`,`cat -v`,`cat file1 file2`等.这不是'cat`没用,只是有些人在`cat file |的无用环境中使用它.cmd`. (2认同)