从文本文件中删除空行

时间:2014-08-06 15:54:12

标签: perl

我有一些代码在perl中逐行清理文件。代码的一部分检查空格行并删除这些空格。根据我的逻辑,它也应该删除只是空行的行,但它不会。

$file = "myfile.txt";  
open (IN, $file) || die "Cannot open file ".$file." for read";       
@lines=<IN>;    
close IN;  

open (OUT, ">", $file) || die "Cannot open file ".$file." for write";  
foreach $line (@lines)  
{    

    #removes all spaces from lines and but won't remove empty lines (it should).
    $line =~ tr/ //d;
    #remove double quotes from file
    $line =~ s/\x22//g;

   print OUT $line;    
}    
close OUT; 

如何添加此代码以删除所有仅为空行的行?转此:

This is "line 1".
This is "line 2".

This is "line 4".
This is "line 5".

进入这个:

Thisisline1.
Thisisline2.
Thisisline4.
Thisisline5.

4 个答案:

答案 0 :(得分:3)

以下是您原来的内容:

>perl -MO=Deparse -i.bak -nlwe "tr/ //d; print if length"
BEGIN { $^I = ".bak"; }
BEGIN { $^W = 1; }
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    tr/ //d;
    print $_ if length $_;
}

与现在的情况存在显着差异。具体来说,您不会考虑换行。您可以使用以下内容:

for my $line (@lines) {    
   $line =~ s/["\s]//g;
   print OUT "$line\n" if length($line);
}

\s匹配包括换行符在内的所有空格。

答案 1 :(得分:1)

您可以使用chomp($line)删除换行符,然后检查$line是否等于空字符串。

这也将避免进一步修改您的代码。

答案 2 :(得分:0)

只需使用$INPLACE_EDIT修改文件:

use strict;
use warnings;

my $file = "myfile.txt";

local @ARGV = $file;
local $^I = '.bak';
while (<>) {
    tr/ "//d;           # Remove spaces and double quotes
    print if ! /^$/;    # Skip blank lines
}
# unlink "$file$^I"; # Optionally delete backup

有关修改文件的其他方法,请查看perlfaq5 - How do I change, delete, or insert a line in a file, or append to the beginning of a file?

答案 3 :(得分:0)

当处于这样的循环中时,无论是在新数组中返回还是正在打印,我总是只使用:

next if($line =~ s/^\s*&/);

应该跳过处理空行。