我只想在我的 perl 脚本中使用 awk 命令,如下所示:
$linum = `awk -F "%" '/^\s*kernel/{print NR}' < $grubFile`;
但它会说:Unrecognized escape \s passed through at ./root line 36.
我如何避免这种情况?谢谢你。
$x = `... \s ...`;
没有意义
$x = "... \s ...";
如果你想要两个字符\
and s
,你需要转义\
双引号中的文字和类似的。就像你会使用
$x = "... \\s ...";
你需要使用
$x = `... \\s ...`;
请注意,您完全无法正确转义$grubFile
too 的内容。如果文件名包含空格,您的命令将失败。并考虑如果它包含 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/;
}