2012-06-04 2 views
1

디렉토리에 files.txt 파일 목록이 있습니다. 각 파일을 통해 텍스트 대체를 실행하고 싶습니다.powershell에서 perl로 파일 편집

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

하지만 펄은 백업하지 않고이 작업을 수행하지 않습니다.

백업없이 바로 편집 할 수 없습니다.

그래서 나는 -i하는 박을 추가 :

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

을 그리고 지금은 불평 :

펄 스크립트 "박"을 열 수 없습니다 : 그런 파일이나 디렉토리를

무엇이 누락 되었습니까?

UPDATE :

내가 선호하는 것은 전적으로 쉘없이이 작업을 수행하는 방법입니다. 어떻게 든 $^I으로 펄에서이 루프를 할 수 있습니까? 0-9보다 더

+0

Windows에서는 -i.bak 스위치를 단독으로 사용해야합니다. 마찬가지로, perl -i.bak -pwe ... \ d {0.4}을 원하고 \ d {1,4}가 아니겠습니까 –

+0

@Chris Charley, 그건 사실이 아닙니다. Windows의 Perl은'-pi.bak'를 완벽하게 받아들입니다. 즉 PowerShell은'-pi.bak' (특히'-pi .bak') 이외의 것을 전달하는 것으로 보이므로 * PowerShell *에 적합한 작업 일 수 있습니다. – ikegami

+0

@wdkrnls,'perl -pi.bak -we "s/(\ d {0,4}) -/$ 1 -/g"'괜찮습니다. 이 문제는 PowerShell의 특정 문제인 것으로 보입니다. – ikegami

답변

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 경기가/당신은 아마 위와 같이 일치되는 5 자리 숫자를 방지하지 않습니다

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

참고 할 수 있도록, 사용하지 않을 때 당신은 원하는 것처럼 보입니다. 이를 위해 사용

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

ikegami가 정확했다. powershell에서 -i.bak는 -i .bak로 해석됩니다. 해결 방법은 powershell이 ​​강제로 단일 인수로 전달하는 것입니다.

마찬가지로 perl '-pi.bak'-we .... # 작은 따옴표로 묶습니다.

관련 문제