Perl 如果文件包含空格,则用当前行追加上一行 我想将行追加到前一行,如果空白行后面跟着行。< /P>

Perl 如果文件包含空格,则用当前行追加上一行 我想将行追加到前一行,如果空白行后面跟着行。< /P>,perl,awk,sed,Perl,Awk,Sed,例如: 输出: 另见上文Håkon Hægland的评论。这是其中的一个问题,它会将整个文件视为一个带有内嵌换行符的长字符串。Perl有一个标志-0,用于更改或关闭完成此操作的默认记录分隔符定义。然后您只需要意识到,根据您对空行的定义,您似乎在请求删除一行中两个或更多换行符的所有序列。如果您对空行的定义可以包括带有空白字符的行,即空格和制表符,则需要更复杂的表达式。这种紧凑的单衬里可以: $ perl -0pe 's/\n\n+//g' blanklines A B C 1D EB 现在请告诉

例如:

输出:


另见上文Håkon Hægland的评论。这是其中的一个问题,它会将整个文件视为一个带有内嵌换行符的长字符串。Perl有一个标志-0,用于更改或关闭完成此操作的默认记录分隔符定义。然后您只需要意识到,根据您对空行的定义,您似乎在请求删除一行中两个或更多换行符的所有序列。如果您对空行的定义可以包括带有空白字符的行,即空格和制表符,则需要更复杂的表达式。这种紧凑的单衬里可以:

$ perl -0pe 's/\n\n+//g' blanklines
A
B
C
1D
EB
现在请告诉我这不是家庭作业


更新:我意识到了一些额外的事情。1由于换行符包含在Perl的空格特殊转义\s中,因此扩展以处理空行上有空白字符的情况实际上并不复杂:Perl-0pe的//\n\s+//g'空行。2此解决方案无法正确处理边缘情况:输入端的空行。我把这个问题留给学生解决-

到目前为止,您尝试了什么?尝试一下:perl-0777-pE的//\n\n+//g'fileif awk,awk'$0={flag=0;next}{if!flag{flag=1;printf%s,$0}else{printf\n%s,$0}}END{printf\n}文件。如果一行是空的,不要在换行符上打印下一行,这就是awk脚本所做的。如果换行符是CRLF怎么办?还是混合?@WiktorStribiżew,在更新中使用\s解决方案,但将\n更改为[\n\r]。这是一种错误的方法。同意,正确的方法是1检测是否存在任何CRLF,2确定哪种是主导样式(如果存在任何混合),3将所有CRLF更改为LF,4执行perl,5将所有LF更改为CRLF(如果CRLF是主导样式)。但这一切都超出了问题的范围。@JeffY:我们如何识别CRLF字符?
A
B
C
1D
EB
$ perl -0pe 's/\n\n+//g' blanklines
A
B
C
1D
EB