0

有下面的 perl grepregex并且它工作正常。

  my  @cont = grep {/,\s*511747450\s*,\s*CAN2\s*$/} @fileContents;

我想将其转换为 unix 系统grep,并以以下方式使用命令尝试了相同的正则表达式system,但它不起作用。

  my $cmd="grep ,\s*5117474501\s*,\s*CAN2\s*\$ " . $dirPath . "/" .$fileName;
  my $exitStatus =system($cmd);
4

2 回答 2

6

\,*并且$对 shell 来说是特殊的。一些更多的逃避是为了。

use String::ShellQuote qw( shell_quote );

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$';

my $cmd = shell_quote('grep', '--', $pat, "$dirPath/$fileName");
my $exitStatus = system($cmd);

或者,您可以简单地通过使用system.

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$';

my @cmd = ('grep', '--', $pat, "$dirPath/$fileName");
my $exitStatus = system({ $cmd[0] } @cmd);
于 2012-10-04T01:46:46.050 回答
3

在某些版本中, grep 不适\s用于 bash。

尝试[:space:]代替\s.

grep 的行为因版本而异。

于 2012-10-04T01:06:52.757 回答