我在perl中调用shell命令时如何转义我的字符串?

时间:2013-01-15 03:18:56

标签: linux perl shell awk

我只想在我的perl脚本中使用awk命令,如下所示:

$linum = `awk -F "%" '/^\s*kernel/{print NR}' < $grubFile`;

但它会说:Unrecognized escape \s passed through at ./root line 36.
我该如何避免?谢谢。

1 个答案:

答案 0 :(得分:5)

$x = `... \s ...`;

没有比

更有意义了
$x = "... \s ...";

如果您想要两个字符\s,则需要以双引号文字和类似名称转义\。就像你使用

一样
$x = "... \\s ...";

你需要使用

$x = `... \\s ...`;

请注意,您完全无法正确转义$grubFile的内容。如果文件名包含空格,则命令将失败。并考虑如果它包含其他特殊于shell的字符,例如|

,会发生什么

正如@ysth所示,以下内容相当于您的命令:

awk -F% '/^\s*kernel/{print NR}' "$grubFile"

摆脱输入重定向意味着你可以简单地使用

use IPC::System::Simple qw( capturex );
my @line_nums = capturex('awk', '-F%', '/^\s*kernel/{print NR}', $grubFile);
chomp @line_nums;

顺便说一下,用Perl纯粹做到这一点并不难。

my @line_nums;
open(my $fh, '<', $grubFile) or die $!;
while (<$fh>) { 
   push @line_nums, $. if /^\s*kernel/;
}