我正在寻找将文件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:空白表示它可能为空或行中可能有标签或空格。
答案 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