如果两行之间只有一个空行,则删除空行;如果有两个空行,则仅删除一个空行

如果两行之间只有一个空行,则删除空行;如果有两个空行,则仅删除一个空行

我得到的 db2 输出如下。

this    is    testing  1

this    is    testing   2


this    is      testing 4

db2 提供输出为查询的输出和一个空行,如果查询没有数据,它会提供一个空行。

我想删除每个输出后的附加空行。

我知道sed -i '/^$/d' file.txt可以删除空行。有没有办法删除每行包含数据的行后面的单个空行?

这是所需的输出:

this    is    testing  1
this    is    testing   2

this    is      testing 4

答案1

这只会删除某个字符后的换行符(仅删除文本行后的第一个换行符):

 sed -n '$!N;s/\(.\)\n/\1/;P;D' file

答案2

如果文件足够小,可以容纳在内存中,您可以使用以下命令来删除文件perl并删除非空格字符和另一个换行符后面的任何换行符:

$ perl -0pe 's/(\S\n)\n/$1/g' file 
this    is    testing  1
this    is    testing   2

this    is      testing 4

答案3

$ awk '{ print; if (length) getline }' file
this    is    testing  1
this    is    testing   2

this    is      testing 4

如果结果有任何内容,这将打印结果并读取其后面的空行。对于空结果,不会跳过任何附加行。

仅当有多个连续的空结果时,才会打印多个连续的空行。输出的每个结果只有一行(空或非空):

$ cat file
this    is    testing  1

this    is    testing   2



this    is      testing 5

$ awk '{ print; if (length) getline }' file
this    is    testing  1
this    is    testing   2


this    is      testing 5

答案4

使用 Awk,您可以将记录分隔符设置为双换行符,然后使用默认的单换行符输出记录分隔符打印每条记录。

使用 POSIX Awk,这将导致在最后一条记录之后出现额外的换行符 - 如果您有 GNU Awk ( gawk),则可以通过在实际输入记录分隔符为空时设置空输出记录分隔符来防止这种情况:

$ gawk -vRS='\n\n' 'RT=="" {ORS=""} 1' file.txt
this    is    testing  1
this    is    testing   2

this    is      testing 4

相关内容