2

ディレクトリに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か?

4

2 に答える 2

1
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;
}

\d/ aが使用されていない場合は、0〜9以上に一致するため、おそらく

 s/(\d{0,4})- /$1 - /ag;
   -or-
 s/([0-9]{0,4})- /$1 - /g;

上記は、5桁が希望どおりに一致することを妨げるものではないことに注意してください。これを行うには、次を使用します。

 s/(?<![0-9])([0-9]{0,4})- /$1 - /g;

さて、あなたが知っているときに番号をそれ自体に置き換える理由はありません\K

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

そして最後に、重複を取り除くこと-もできます。

 s/(?<![0-9])[0-9]{0,4}\K(?=- )/ /g;
于 2012-06-04T22:34:41.163 に答える
1

池上は絶対に正しかった。PowerShellでは、-i.bakは-i.bakとして解釈されます。解決策は、PowerShellに単一の引数として渡すように強制することです。

perl'-pi.bak' -we ....#のように一重引用符で囲みます。

于 2012-08-08T09:55:27.890 に答える