我只想在我的perl脚本中使用awk命令,如下所示:
$linum = `awk -F "%" '/^\s*kernel/{print NR}' < $grubFile`;
但它会说:Unrecognized escape \s passed through at ./root line 36.
我该如何避免?谢谢。
答案 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/;
}