如果文件不存在,Perl正则表达式会扩展变量并死掉

时间:2016-08-17 18:41:13

标签: regex perl

我找到了这一行:

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行中止。

2 个答案:

答案 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