将两个空行合并为一个

时间:2014-06-23 19:07:21

标签: bash sed

我正在寻找将文件A转换为文件B的解决方案,这需要将两个空白行合并为一个。

文件-A:

// Comment 1
// Comment 2

// Comment 3


// Comment 4



// Comment 5

文件-B:

// Comment 1
// Comment 2

// Comment 3

// Comment 4

// Comment 5

this post开始,我知道如何删除空行,我想知道如何将两个连续的空白行合并为一行。

PS:空白表示它可能为空或行中可能有标签或空格。

6 个答案:

答案 0 :(得分:4)

sed -r 's/^\s+$//' infile | cat -s > outfile

sed删除空行上的任何空格。 -s的{​​{1}}选项将连续的空白行压缩为一个。

答案 1 :(得分:4)

以下是awk的简单解决方案:

awk '!NF && !a++; NF {print;a=0}' file
// Comment 1
// Comment 2

// Comment 3

// Comment 4

// Comment 5

NF计算字段数;请注意,完全由空格和制表符组成的行也会计为空行 a用于计算空行,如果它超过1,则跳过它。

答案 2 :(得分:4)

这可能适合你(GNU sed):

sed '$!N;s/^\s*\n\s*$//;P;D' file

这会将2个空白行转换为一个。

如果要将多个空行替换为一个:

sed ':a;$!N;s/^\s*\n\s*$//;ta;P;D' file

反思一个更简单的解决方案是:

sed ':a;N;s/\n\s*$//;ta' file

将一个或多个空行挤压到一个空白行。

更简单的解决方案是使用范围条件:

sed '/\S/,/^\s*$/!d' file

这将删除非空行后的空白行。

答案 3 :(得分:1)

This page可能会派上用场。 TL; DR如下:

# delete all CONSECUTIVE blank lines from file except the first; also
# deletes all blank lines from top and end of file (emulates "cat -s")
sed '/./,/^$/!d'          # method 1, allows 0 blanks at top, 1 at EOF
sed '/^$/N;/\n$/D'        # method 2, allows 1 blank at top, 0 at EOF

答案 4 :(得分:0)

这应该有效:

sed 'N;s/^\([[:space:]]*\)\n\([[:space:]]*\)$/\1\2/;P;D' file

答案 5 :(得分:0)

awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file

我原本希望生成一个更短的Perl版本,但Perl不会为其记录分隔符使用正则表达式。

awk不会就地编辑。你必须这样做:

awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file > tmp && mv tmp file