如何在Perl中使用UNIX命令?(在Windows计算机上使用)

如何在Perl中使用UNIX命令?(在Windows计算机上使用),windows,perl,batch-file,unix,Windows,Perl,Batch File,Unix,我需要用第二个文件(OEMDS.txt)的内容过滤一个文件(javasrc.txt)的内容。这需要在Windows环境中完成。我不知道Windows批处理文件,我知道UNIX命令,我是Perl新手,我想让我的生活尽可能简单,所以我想写一个UNIX命令,在它周围放上“system()”,它应该可以工作 不幸的是,它似乎没有那么简单:以下Perl脚本拒绝工作: system("cat javasrc.txt | grep -v qx(cat OEMDS.txt) > javasrc_temp.

我需要用第二个文件(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中做类似的事情-不需要
系统
命令

#!/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/; 
}
#/usr/bin/env perl
严格使用;
使用警告;

打开(我的$exclude_列表),我可能会在perl中执行类似的操作-不需要
系统
命令

#!/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/; 
}
!/usr/bin/env perl
严格使用;
使用警告;

按照@ThisSuiteisBlacknot的建议,用perl打开(我的$exclude_列表),。代码不多,而且速度可能更快:

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
my$oemds=do{

按照@ThisSuiteisBlacknot的建议,打开我的$fh,“,用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
my$oemds=do{

打开我的$fh,“同时我有了一个解决方案,它实际上比我想象的要简单


我的理由如下:我需要批量做一些事情(我不知道),我知道可以使用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

谢谢大家的支持,我已经标记了你们所有的答案。

同时,我有一个答案的解决方案,它实际上比我想象的要简单


我的理由如下:我需要批量做一些事情(我不知道),我知道可以使用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

感谢大家的支持,我已经标记了所有答案。

运行cygwin then(most)CLI unix命令将作为expected@MarcB或者只使用本机Perl命令,因为它们可以轻松地完成与
cat
grep
相同的工作。这与您的问题无关,但是在命令中使用
cat
完全没有必要:
grep-vf OEMDS.txt javasrc.txt>javasrc_temp.txt
(我假设OEMDS.txt只包含一行)OEMDS.txt中有什么内容?我想知道为什么windows机器上会出现cat和grep等“unix”命令。然后运行cygwin(大多数)CLI unix命令将作为expected@MarcB或者只使用本机Perl命令,因为它们可以轻松地完成与
cat
grep
相同的工作。这与您的问题无关,但是在命令中使用
cat
完全没有必要:
grep-vf OEMDS.txt javasrc.txt>javasrc_temp.txt
(我假设OEMDS.txt只包含一行)OEMDS.txt中有什么?我想知道为什么您希望在windows机器上存在cat和grep等“unix”命令。“知道Perl能够启动unix命令”perl可以启动任何操作系统命令或程序。perl在每个平台上都内置了grep。你浪费了大量时间来运行其他操作系统命令。这将花费更长的时间,而且不可移植。“要知道perl能够启动UNIX命令”perl可以启动任何操作系统命令或程序。perl在每个平台上都内置了grep。你浪费了大量时间来运行其他操作系统命令。这将花费更长的时间,而且不可移植。