我需要通过第二个文件(OEMDS.txt)的内容过滤一个文件(javasrc.txt)的内容。这需要在Windows环境中完成。我不知道Windows批处理文件,我知道UNIX命令,我是Perl的新手,我想让我的生活尽可能简单,所以我想写一个UNIX命令,把“system()”围绕它,它应该工作。
不幸的是,它似乎并不那么简单:以下Perl脚本拒绝工作:
system("cat javasrc.txt | grep -v qx(cat OEMDS.txt) > javasrc_temp.txt");
我收到错误消息:
grep: OEMDS.txt): No such file or directory
供您参考:我已使用以下内容启动cat
命令:
- backticks
- $()
- qx()
- qx{}
总是结果是一样的:Perl似乎有一个终止字符的问题(第二个反引号或逗号,......)
现在我考虑一下,我按照以下方式启动它(我不知道它是否相关):
perl filter_by_file_content.pl
有人知道我能做什么吗?
答案 0 :(得分:3)
我可能只是在perl中做这样的事情 - 不需要system
命令。
#!/usr/bin/env perl
use strict;
use warnings;
open ( my $exclude_list, '<', 'OEMDS.txt' ) or die $!;
my $exclude_regex = join ( "|", map { s/[\r\n]//r } <$exclude_list> );
$exclude_regex = qr/($exclude_regex)/;
open ( my $src, '<', 'javasrc.txt' ) or die $!;
while ( <$src> ) {
print unless m/$exclude_regex/;
}
注意 - 表示排除文件中的任何元字符都将被视为正则表达式。如果这是一个问题,您可以使用map { quotemeta }
。
答案 1 :(得分:1)
如@ThisSuitIsBlackNot所示,请在perl中执行此操作。这不是很多代码,反正可能更快:
my $oemds = do {
open my $fh, '<', 'OEMDS.txt' or die "Can't read OEMDS.txt: $!";
local $/; # probably not required.
<$fh>;
};
chomp $oemds;
open my $js, '<', 'javasrc.txt' or die "Can't read javasrc.txt: $!";
my @filtered;
while(<$js>) {
chomp;
next if /$oemds/; # grep -v
push @filtered, $_;
}
close $js;
# write to javasrc_temp.txt if really required
我怀疑你真的想要程序中的过滤行,而不是临时文件,这样可以避免临时文件。