我找到了这一行:
perl -p -i -e 'BEGIN{ -f $ARGV[0] or die"no file" } s/foo/bar/'
non-existent-file.txt
我想让它适用于我的案子。扩展替换中的变量,但我根本不熟悉Perl语法:)
perl -i -0777 -pe 'BEGIN{ -f $ARGV[0] or die".HEAD file is missing" }'
"s|^\\Q${repo}:\\E.+$|${newrepo}|gm" .HEAD;
在-e第1行缺少.HEAD文件。 BEGIN失败 - 编译在-e第1行中止。
答案 0 :(得分:3)
Perl变量与shell变量不同。要将值传递给脚本,您可以使用参数,但是您需要停止处理第一个eof上的输入,否则Perl会将参数视为文件名:
perl -i -0777 -ne 'BEGIN { ($file, $repo, $new) = @ARGV;
die "$file missing\n" unless -f $file;
}
s/^\Q$repo:\E.+$/$new/gm;
print;
last if eof;
' -- .HEAD "$repo" "$newrepo"
或者,自己打开文件:
if perl -0777 -e '($file, $repo, $new) = @ARGV;
open $FH, "<", $file or die "$file: $!";
while (<$FH>) {
s/^\Q$repo:\E.+$/$new/gm;
print;
}' -- .HEAD "$repo" "$newrepo" > newfile
then
mv newfile .HEAD
fi
答案 1 :(得分:3)
不要(尝试)在shell脚本中生成Perl代码!!!
perl -i -pe'
BEGIN {
$repo = shift(@ARGV);
$newrepo = shift(@ARGV);
open(my $fh, '<', $ARGV[0])
or die("Can't open $ARGV[0]: $!\n");
}
s|^\Q$repo:\E.+$|$newrepo|g;
' "$repo" "$newrepo" .HEAD
或
export repo
export newrepo
perl -i -pe'
BEGIN {
open(my $fh, '<', $ARGV[0])
or die("Can't open $ARGV[0]: $!\n");
}
s|^\Q$ENV{repo}:\E.+$|$ENV{newrepo}|g;
' .HEAD
或
repo="$repo" newrepo="$newrepo" perl -i -pe'
BEGIN {
open(my $fh, '<', $ARGV[0])
or die("Can't open $ARGV[0]: $!\n");
}
s|^\Q$ENV{repo}:\E.+$|$ENV{newrepo}|g;
' .HEAD
注意:
即使-f
返回false,该文件也可以存在。实际错误在$!
。使用open
在检查文件是否可以打开时比-f
更准确。
为了便于阅读,我添加了换行符。如果你愿意,可以删除它们,但是没有必要这样做。
我删除了无用的-0777
以及因此而变得无用的/m
。