2016-08-23 100 views
0

我需要通过第二个文件(OEMDS.txt)的内容来过滤一个文件(javasrc.txt)的内容。这需要在Windows环境中完成。我不知道Windows批处理文件,我知道UNIX命令,我是Perl新手,我想让自己的生活尽可能简单,所以我想写一个UNIX命令,把“system()”围绕它,它应该工作。如何在Perl中使用UNIX命令? (用于Windows机器)

不幸的是,似乎没有那么简单:下面的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{} 

Always th结果是一样的:Perl似乎有一个问题,终止字符(第二个反引号或逗号,...)

现在我想到了,我用下面的方式启动它(我不知道这是否是相关的):

perl filter_by_file_content.pl 

有谁知道我能做些什么?

+0

然后运行cygwin然后(大多数)CLI unix命令将按预期工作 –

+2

@MarcB或者只是使用本机Perl命令,因为它们可以轻松地完成与'cat'和'grep'相同的工作。 – ThisSuitIsBlackNot

+3

与你的问题无关,但是在你的命令中'cat'的使用是完全没有必要的:'grep -vf OEMDS.txt javasrc.txt> javasrc_temp.txt'(我假设是OEMDS。txt包含一行) – ThisSuitIsBlackNot

回答

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

由于@ThisSuitIsBlack不建议,在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 

我怀疑你真的想过滤的线在你的程序,而不是在一个临时文件中,这样就避免了临时文件。

-1

同时我有一个解答我的答案,它实际上比我想象的更简单。我的推理如下:我需要批量操作(我不知道),我知道可以使用Perl和Python,我知道我在UNIX命令中的方式,我知道Perl是能够启动UNIX命令,因此我的想法和相应的问题。

但是,答案要容易得多:我想使用grep,因为这是我熟悉的UNIX命令,但有一个非常类似的Windows命令:findstr。使用这个命令,我可以很容易地获得我想要的东西:

findstr /V /G:OEMDS.txt javasrc.txt > javasrc_temp.txt 
move /y javasrc_temp.txt javasrc.txt 

谢谢大家的支持,我标记了你的答案。

+0

“知道Perl能够启动UNIX命令”,perl可以启动任何操作系统命令或程序。 Perl在每个平台上都内置了grep。你浪费时间去执行其他操作系统命令。这将需要更长的时间,不便携。 –