2014-06-23 34 views
3

我正在寻找将文件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

您是否喜欢每行之间有一条空行,即使有三条空白行连续。请举例输出。 – Jotne

+0

我以为我可以使用一个循环来处理2+空白行的情况,所以我没有问这个问题。你的意思是有一个答案2+空白行? – Daniel

+0

好的我的回答是我认为你喜欢做的:) – Jotne

回答

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

sed消除了对一个空行任何空白。 cat-s选项将连续的空行压缩为一个。

+1

这个作品,谢谢。是否有可能做“就地”编辑? – Daniel

+1

+1;巧妙的工具组合,尽管语法是GNU'sed'特有的。符合POSIX的替代方案:'sed's/^ [[:blank:]] \ {1,\} $ //'file | cat -s> outfile'。 – mklement0

+1

@Daniel:您必须使用标准惯用法来解决无法执行就地更新的问题:使用'> /tmp/tmp.$$ && move/tmp/tmp来代替'> outfile'。 $$ infile'。 – mklement0

0

这应该工作:

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

不工作。 :( – Daniel

+1

@丹尼尔我可以看看它,如果你提供样本输入和/或描述问题 –

4

这里是awk一个简单的解决方案:

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

// Comment 3 

// Comment 4 

// Comment 5 

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

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 
+1

这将失败,如果有'空格'和或'标签'。OP请求'PS:空也可能意味着可能标签或行中的空格。' – Jotne

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 

这将删除比以下的非空白行以外的任何空行。

+0

您能否解释'!N;'和'; P; D'部分? – Searene

+0

@MarkZar请参阅[here](http://www.gnu.org/software/sed /manual/sed.html#Other-Commands),但首先看到我最近编辑的一个更好的解决方案。 – potong

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 
+1

平视:需要一个'awk'实现,将regexes识别为记录分隔符(非POSIX),例如GNU' awk'。输出中的尾部'\ n \ n'很尴尬。 – mklement0