2012-09-16 3 views
1

같은 파일의 다른 열의 값을 기반으로 제자리에있는 파일을 편집하고 싶습니다 (열 값 대체). 파일. 대체 후 출력을 다른 파일로 리디렉션하고 싶지 않지만 대신 파일을 편집하고 싶습니다. 특히 편집해야하는 파일에 프로그램이 동시에 액세스 할 수 없으며 현재 위치에서의 편집이 반드시 필요하므로같은 파일의 다른 열의 값을 기반으로 제자리에서 파일을 편집하고 싶습니다.

나는 아래 코드를 시도했습니다. 하지만 다시 한 줄씩 파일을 입력하려고합니다.

#!/usr/bin/perl -w 

open(FILEIN, "/dummy/chaat/h2") || die("Cannot open file"); 
@file = <FILEIN>; 
seek FILEIN, 0, 0; 

foreach $file (@file) { 
    @field = split(/\|/, $file); 
    print $field[8] . "\n"; 
    if ($field[8] eq "ROBERT") { 
     $file =~ s/JAMES/FUDIK/g; 
     print FILEIN $file; 
    } 
} 

샘플 레코드는 다음과 같습니다. 여기서 나는 이것을 인라인 편집하고 싶다. 필드 8 로버트 다음 필드에 FUDIK와 제임스를 대체 할 경우 7

Change|sinmg|ewfewf|ewfew|def|fdfd|JAMES|rewr|ROBERT|dsf|fe 
Change|sinmg|ewfewf|ewfew|def|JAMES|fewf|rewr|BEASLEY|dsf|fe 

나는이

+1

새 필드가 이전 필드와 완전히 같은 크기가 아니라면 파일을 다시 쓰지 않아야합니다. 의도 한 경우 데이터베이스를 사용하십시오. – Thor

+0

@Thor TLP의 대답은 필드 크기와 관계없이 작동합니다. – Chkusi

+1

'-i' 스위치는 내부에서 말할 수 있지만 임시 파일은 백그라운드에서 사용됩니다 (perlrun (1) 참조). – Thor

답변

3

에 어떤 도움을 주셔서 감사합니다 것이 펄 한 라이너 :

perl -F'\|' -i -lape 'if ($F[8] eq "ROBERT") { s/JAMES/FUDIK/g }' /dummy/chaat/h2 

-i 옵션 것이다 적절한 편집을하십시오. 당신은 부분 일치를 방지하기 위해 대체를 제한 할 수 있습니다, 예를 들면 :

s/(?<=\|)JAMES(?=\|)/FUDIK/g 

또는 당신이 대신 -p-n 스위치를 사용하고

s/JAMES/FUDIK/g for @F } print join "|", @F; 

을 할 수있는 당신은 알고 있어야 그이 현재 위치에서 편집 사실 새 파일을 쓰고 오래된 파일을 복사하는 것입니다. 이것을 피하려면 심각한 저글링을하고 글쓰기 중에 파일을 잠궈 야합니다.

+0

답해 주셔서 감사합니다. 그러나 위의 명령을 시도하고 이것은 파일 내용이 사라져서 0 바이트로 만듭니다. – Chkusi

+0

@Chkusi이 명령으로 파일을 잘라낼 방법이 없습니다. 8 번 필드가 ROBERT이고, JAMES를 FUDIK로 변경하는 경우에만 * 파일에 영향을 미칩니다. – TLP

+0

파일이 수정되지 않습니다. 이 질문에 응답하여 로그를 표시했습니다. – Chkusi