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 ...";

2文字\とが必要な場合は、二重引用符で囲まれたリテラルなどでsエスケープする必要があります。\あなたが使うのと同じように

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

あなたが使用する必要があります

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

内容も完全にエスケープできないことに注意してください$grubFile。ファイル名にスペースが含まれていると、コマンドは失敗します。また、シェルに固有の他の文字(。など)が含まれている場合は、代わりに何が発生する可能性があるかを検討して|ください。

@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 に答える