使用powershell中的perl就地编辑文件

使用powershell中的perl就地编辑文件,perl,powershell,Perl,Powershell,我有一个目录中的files.txt文件列表。我想在每个文件中运行文本替换 $f = (get-content files.txt) Foreach ($i in $f) { perl -pi -we "s/(\d{0,4})- /$1 - /g" $i } 但是perl不喜欢在不进行备份的情况下执行此操作 没有备份,无法进行就地编辑 因此,我将.bak添加到-I: $f = (get-content files.txt) Foreach ($i in $f) { perl -pi.bak -w

我有一个目录中的files.txt文件列表。我想在每个文件中运行文本替换

$f = (get-content files.txt)
Foreach ($i in $f) { perl -pi -we "s/(\d{0,4})- /$1 - /g" $i }
但是perl不喜欢在不进行备份的情况下执行此操作

没有备份,无法进行就地编辑

因此,我将.bak添加到-I:

$f = (get-content files.txt)
Foreach ($i in $f) { perl -pi.bak -we "s/(\d{0,4})- /$1 - /g" $i }
现在它抱怨:

无法打开perl脚本“.bak”:没有这样的文件或目录

我错过了什么

更新:

我更喜欢的是一种完全不用外壳的方法。我可以在perl中用
$^I
完成这个循环吗

my $qfn = 'files.txt';
open(my $fh, '<', $qfn)
   or die("Can't open file list \"$qfn\": $!\n");

local @ARGV = <$fh>;
local $^I = '.bak';
local $_;
while (<>) {
   s/(\d{0,4})- /$1 - /g;
   print;
}
请注意,上述情况并不妨碍5位数字按照您的意愿进行匹配。为此,请使用:

 s/(?<![0-9])([0-9]{0,4})- /$1 - /g;
最后,我们还可以消除重复的
-

 s/(?<![0-9])[0-9]{0,4}\K(?=- )/ /g;

s/(?ikegami是绝对正确的。在powershell中-i.bak被解释为-i.bak。解决方案是强制powershell将其作为单个参数传递


perl'-pi.bak'-we…#用单引号括起来。

在Windows上,有必要单独设置-i.bak开关。例如,perl-i.bak-pwe…您确定要\d{0.4}而不是\d{1,4}@Chris Charley,那不是真的。Windows上的Perl接受
-pi.bak
非常好。也就是说,PowerShell似乎传递的不是
-pi.bak
(特别是
-pi.bak
),所以这可能是PowerShell的正确操作。@wdkrnls,
Perl-pi.bak-we“s/(\d{0,4})-/$1-/g”
适合
cmd
。这似乎是PowerShell特有的问题。谢谢,克里斯!我想要\d{1,4}是对的。但是放置-I.bak并没有改变错误。我正在使用DWIM perl 5.14.2。perl在
-I
.bak
之间收到一些空格。不知道为什么。(没有也从未使用过PowerShell。)
 s/(?<![0-9])[0-9]{0,4}\K- / - /g;
 s/(?<![0-9])[0-9]{0,4}\K(?=- )/ /g;