Perl:如何删除文件每行开头的空格?

时间:2015-03-11 19:36:17

标签: perl

我已经编写了这段代码,但它没有工作......白色空间仍然存在

open(FILE2, "<WordNetTest2.txt");
my @lin=<FILE2>;
while (<FILE2>) {
    s/\^\s+//g;
}
print FILE2 "@lin";
close(FILE2);

5 个答案:

答案 0 :(得分:4)

您的代码存在一些问题:

  • 3参数开放要好得多。
  • 您应该检查open的返回代码。
  • 将文件分配给数组会读取整个文件。这在您的情况下是多余的,并浪费内存(这是较大文件的考虑因素)。
  • 但是当你这样做时,后面的while循环没有任何东西可读。
  • 您正在打开要读取的文件,这意味着它无法写入。
  • 你的正则表达式被打破了。转义\^使其成为字面值。尝试匹配行首的s/\A\s+//w/^\s+//

这样的事情:

#!/usr/bin/perl
use strict;
use warnings; 

open ( my $input, "<", "WordNetTest2.txt" ) or die $!; 
open ( my $output, ">", "WordNetTest2NEW.txt" ) or die $!; 

while ( my $line = <$input> ) {
   $line =~ s/^\s+//;
   print {$output} $line;
}

close ( $input );
close ( $output );

#copy one over the other if so inclined

但是,使用sed

可以更简单地解决您的问题
sed -i.bak -e 's/^ +//g' WordNetTest2.txt

答案 1 :(得分:2)

您的代码存在一些问题。

打开文件句柄进行阅读(更好的是open的三参数版本,带有词法文件句柄和错误检查open my $fh , '<' , 'file.txt' or die "Cannot read file.txt: $!\n";)。然后你读入数组@lin中的完整文件,将文件句柄保留在EOF中。因此while循环无关。 现在,您尝试将未修改的数组打印到只读文件句柄,然后关闭文件句柄。

更好的是:

use strict ;
use warnings ;

my $filename = 'WordNetTest2.txt' ;
open my $fh , '<' , $filename or die "Cannot read '$filename': $!\n" ;
my @lines = <$fh> ;
close $fh ;

for ( @lines ) {
  s/^\s+// ; # No need for global substitution
}

open $fh , '>' , $filename or die "Cannot write '$filename': $!\n" ;
print $fh @lines ;
close $fh ;

答案 2 :(得分:0)

你已经逃脱了你的插入符号:

s/\^\s+//g;
  ^--

这意味着它不再是&#34;字符串的开头&#34;正则表达式metachar。它变成了一个字面插入符号,意思是:

foo^  bar      <--matches
foo   bar      <--no match, because no caret

答案 3 :(得分:0)

试试这个:

perl -i -pe 's/^\s+//' WordNetTest2.txt

答案 4 :(得分:0)

非常简单:

open(FILE2, "< WordNetTest2.txt");
my @lin=< FILE2>;
$str_file = join("", @lin);
print FILE2 "$str_file";
close(FILE2);

对我有用。