当你不知道的时候
如果你要查找一个已知位置的文本,例如当 Perl 告诉你脚本执行到第 73 行出现了问题,或者你正在处理文件的第 1892 行,你可以使用sed 来显示特定的行(我只是不喜欢数到 1892 行)。而且额外花一点点力气,你就可以只显示这一行。
错误信息可能像这个样子:
“syntax error line 73 near ”} else“ ”
你可以使用一个sed命令来显示出问题的这行:
$ sed -n 73p showvars
else
好了,就是这行,但是我们也没有比之前多知道些什么。通过显示前面几行可以增加一点上下文信息,我们就可以定位错误。这里有一个类似的命令可以显示这行和之前的十行:
sed -n 63,73p showvars
if $password eq "a_secret";
{
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|n|n|g;
$val =~ s|"|"|g;
print '${var}="${val}"n'
};
}
else
哎呦!这看上去是某些人在写 if 语句时出了问题!我们可以很容易地修复它。
你还可以使用 sed 命令来强调包含特定内容的行。在下面的命令里,我们增加了一个 “箭头标记” 来强调每一个包含 foreach 命令的行:
$ sed '/print/{b label1; {:label1 ; s/^/# / ; s/$/ <===/ ;} }' showvars
#!/bin/bash
if $password eq "a_secret";
{
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|n|n|g;
$val =~ s|"|"|g;
# print '${var}="${val}"n' <===
};
}
else
你可以使用类似的命令注释掉你的 print 命令:
$ sed '/print/{b label1; {:label1 ; s/^/# / ; s/$/ <===/ ;} }' showvars
#!/bin/bash
if $password eq "a_secret";
{
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|n|n|g;
$val =~ s|"|"|g;
# print '${var}="${val}"n' <===
};
}
else
大海捞针很难,其实地毯上找针也都不容易。但是通过使用一些最常见 Unix 命令的变形,就可以很容易找到你要找的东西,甚至当你并不知道要找什么的时候。