【问题标题】:Why does this egrep command work in my shell but not in Perl?为什么这个 egrep 命令在我的 shell 中有效,而在 Perl 中无效?
【发布时间】:2015-12-24 17:22:50
【问题描述】:

以下命令适用于 Linux 的命令行:

egrep -r -i -I -H -A5 "^name#maria.*?#[0-9]{4}#.*?#.*?#.*?$" .

但是当我在 Perl 脚本中使用它时,它不会返回任何内容。这是 Perl 代码:

my @rows = `egrep -r -i -I -H -A5 "^name#maria.*?#[0-9]{4}#.*?#.*?#.*?$" .`;

我做错了什么?

【问题讨论】:

  • 不确定为什么要在 perl 脚本中使用它。你能把它改写成可读的 perl 吗?
  • @gaussblurinc,他正在使用带有递归选项的 egrep。在 perl 中会更冗长。
  • 请不要编辑问题以删除导致您提出问题的问题。还是您的意思是即使在删除 $ 之后它也不适合您?
  • 提示,perl -E 'say qq(egrep -r -i -I -H -A5 "^name#maria.*?#[0-9]{4}#.*?#.*?#.*?$" .)'

标签: linux perl grep


【解决方案1】:

$" 是一个perl variable 并且正在反引号内扩展。你需要逃避美元

my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#[0-9]{4}#.*?#.*?#.*?\$" .};

我使用的是qx{},而不是不太明显的反引号。


另一种方法,使用open 并将每个参数作为单独的参数传递:

use autodie qw/open close/;
my @command = ('egrep','-r','-i','-I','-H','-A5','^name#maria.*?#[0-9]{4}#.*?#.*?#.*?$','.');
open my $pipe, '-|', @command;
chomp( my @rows = <$pipe> );
close $pipe;

【讨论】:

  • 感谢您的回答。我试过了,但它不起作用。这有效:my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#.*?" .}; -- 这不起作用 my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#[0-9]{4}#.*?" .}; -- 这也不起作用 my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#.*?#.*?" .};
  • @MarcosCamargo 您必须比“它不起作用”更具体一点。你有错误吗?如果是这样,确切的错误信息是什么?如果没有,你会得到什么?一个空数组?包含一个或多个空字符串的数组?完全不同的东西?
  • 这工作 my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#.*?" .}; 和不工作 my @rows = qx{egrep -r -i -I -H -A5 "^name#maria.*?#.*?#.*?" .};
  • 非常感谢您的帮助。我发现了我的错误。我正在搜索的文件未正确生成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多