我正在尝试使用perl脚本中的正则表达式修改文本文件中的某些内容,它不会修改任何内容,但是当我在textpad中使用相同的常规表达式时它会修改
输入
ab 3fdfs2sd 6 Feb 2015.doc Creatings som junk text: ccpsd(1).xml.
sdfdgd .df . fds 18 Mar 2015.doc Creatings som junk text: ccpsd(2).xml.
输出需要:
ccpsd(1).xml-ab 3fdfs2sd 6 Feb 2015.xml
ccpsd(2).xml-sdfdgd .df . fds 18 Mar 2015.xml
码
use strict;
open(FILE, "<G:/in.txt") || die "File not found";
my @lines = <FILE>;
close(FILE);
my @newlines;
foreach(@lines) {
$_ =~ s/(^.+?)\.doc\s*.+?[\:]\s*(CC.+?xml)\./\2-\1.xml/igs;
push(@newlines,$_);
}
open(FILE, ">/out.txt") || die "File not found";
print FILE @newlines;
close(FILE);
答案 0 :(得分:0)
您应该使用双>>
并指定文件名:
my $outfile = 'out.txt';
open (FILE, ">> $outfile") || die "File not found";
正如此sample program中所测试的那样,正则表达式很好。
答案 1 :(得分:0)
在我看来,您错过了输出文件的驱动器 我做了:
#!/usr/bin/perl
use strict;
use warnings;
my $in_file = 'G:/in.txt';
my $out_file = 'G:/out.txt';
open my $in, '<', $in_file or die "Unable to open '$in_file': $!";
open my $out, '>', $out_file or die "Unable to open '$out_file': $!";
while(<$in>) {
chomp;
s/^(.+?)\.doc\s*.+?:\s*(CC.+?xml)\./$2-$1.xml/i;
print $out $_,"\n";
}
答案 2 :(得分:0)
只需使用Perl one-liner
perl -pe's/(^.+?)\.doc\s*.+?[\:]\s*(CC.+?xml)\./\2-\1.xml/ig'
BTW您是否阅读过perldoc perlre
并确定自己明白了吗?因为您按行读取了输入文件,并且代码中的s
修饰符没有任何意义。如果你真的想为多行模式应用regexp,你应该使用。
perl -0777 -pe's/(^.+?)\.doc\s*.+?[\:]\s*(CC.+?xml)\./\2-\1.xml/igs'