1

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

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

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

4

1 回答 1

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

没有意义

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

如果你想要两个字符\and s,你需要转义\双引号中的文字和类似的。就像你会使用

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

你需要使用

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

请注意,您完全无法正确转义$grubFiletoo 的内容。如果文件名包含空格,您的命令将失败。并考虑如果它包含 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/;
}
于 2013-01-15T03:23:12.460 回答