【问题标题】:How to use UNIX commands in Perl? (to be used on a Windows machine)如何在 Perl 中使用 UNIX 命令? (在 Windows 机器上使用)
【发布时间】:2016-12-30 12:18:15
【问题描述】:

我需要通过第二个文件 (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

有人知道我能做什么吗?

【问题讨论】:

  • 运行 cygwin 然后(大多数)CLI unix 命令将按预期工作
  • @MarcB 或者只使用本机 Perl 命令,因为它们可以轻松完成与 catgrep 相同的工作。
  • 与您的问题无关,但在您的命令中使用 cat 完全没有必要:grep -vf OEMDS.txt javasrc.txt > javasrc_temp.txt(我假设 OEMDS.txt 包含一行)
  • OEMDS.txt 中有什么内容?
  • 我质疑你为什么期望像 cat 和 grep 这样的“unix”命令存在于 Windows 机器上。

标签: windows perl batch-file unix


【解决方案1】:

我可能只是在 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 }

【讨论】:

    【解决方案2】:

    正如@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
    

    我怀疑你真的想要程序中的过滤行,而不是临时文件,这样可以避免临时文件。

    【讨论】:

      【解决方案3】:

      虽然我的答案有一个解决方案,但它实际上比我想象的要简单。

      我的理由如下:我需要批量做某事(我不知道),我知道可以使用 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 能够启动 UNIX 命令" perl 可以启动任何操作系统命令或程序。 Perl 在每个平台上都内置了 grep。您已经浪费了时间来运行其他操作系统命令。它需要更长的时间并且不便携。
      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2013-06-09
      • 2015-01-18
      相关资源
      最近更新 更多