2011-08-09 6 views
34

1_classification.dat, 2_classification.dat 등으로 이름이 지정된 모든 텍스트 파일에서 "blue"를 "red"로 바꾸려고합니다. 이 코드를 시도했지만 작동하지 않는 동일한 파일을 편집하고 싶습니다. 내가 어디로 잘못 가고 있니?Perl에서 기존 파일의 문자열을 바꾸는 방법은 무엇입니까?

@files=glob("*_classification.dat"); 
foreach my $file (@files) 
{ 
    open(IN,$file) or die $!; 
    <IN>; 
    while(<IN>) 
    { 
     $_='~s/blue/red/g'; 
     print IN $file; 
    } 

    close(IN) 
} 

답변

92

원 라이너에 문제가 있습니까?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat 

설명

  • -p 프로세스는 다음
  • -i은 내부 편집을 활성화 라인으로 <> 행을 인쇄합니다. 파일은 라인별로
+6

따옴표를 코드에 공백이 포함되지 않은 경우 명령이 전혀 윈도우 – Zaid

+0

그래, 나 따옴표에서 실행되는 경우 : 여기에 내가 무슨 짓을했는지입니다. – bart

+4

인수에서'*'globbing을 사용하는 것이 창에서 작동하지 않는 것 같습니다. – TLP

10

$_='~s/blue/red/g';

어의 .bak 확장

  • 파일의 내용이다 암시 적 변수에 정규식 대체 행위를 사용하여 백업 뭐??

    그냥

    s/blue/red/g; 
    

    또는, 당신은 변수 사용에 대한 주장 ($ _를 사용하는 경우 필요하지 않습니다,하지만 난 그냥 올바른 구문을 보여주고 싶은 없음) 경우 :

    $_ =~ s/blue/red/g; 
    
  • 2

    없음 기존 대답 중 스크립트 (단 한 줄자가 아닌) 내에서이를 수행하는 방법에 대한 완전한 예제가 제공되었습니다.

    rename($file, $file.'.bak'); 
    open(IN, '<'.$file.'.bak') or die $!; 
    open(OUT, '>'.$file) or die $!; 
    while(<IN>) 
    { 
        $_ =~ s/blue/red/g; 
        print OUT $_; 
    } 
    close(IN); 
    close(OUT); 
    
    관련 문제