2017-12-11 18 views
-2

perl 스크립트를 사용하여 파일에 새 행을 추가하려고합니다. 나는 시도했지만 행운이 없다.perl 스크립트를 사용하여 파일의 특정 위치에 행 삽입

if($correctedContents[$i] ~= /second line/){ 
@data = $correctedContents[$i] 
    push (@data, '\n TEST Line'); 

예 : '두 번째 줄'행을 찾을 때마다 파일에 "TEST Line"을 추가하십시오.

은 File2.txt, 추가 된 새로운 라인 예상 출력 후

first line 
second line 
third line 

first line 
second line 
third line 

.....

: 사전

+0

조건을 사용하여 '두 번째 줄'이 발견되면 배열에 할당됩니다. 마지막으로 push 명령을 사용하여 줄을 추가했지만 작동하지 않았습니다. – Beginner

+0

이미 언급 한 [@dave cross] (https://stackoverflow.com/a/47753759/4251338) 이후로받은 답변을 살펴 보시겠습니까? Tie :: File' 모듈을 사용하십시오. 모듈을 기반으로 검색 엔진에서 사용할 수있는 몇 가지 샘플이 있습니다. – ssr1012

답변

2

당신의 천국에서

first line 
second line 
TEST Line 
third line 

first line 
second line 
TEST Line 
third line 

감사합니다 ' 대단히 도움이되는 코드를 우리에게 충분히 보여주었습니다. 그러나 특히 변경된 데이터를 출력 파일에 다시 쓰는 코드는 표시하지 않았습니다. 일반적으로

, 아래 세 단계에이 종기 같은 작업 : 파일에서

  1. 데이터 읽기.
  2. 어떤 식 으로든 데이터를 업데이트하십시오.
  3. 변경된 데이터를 다시 파일에 씁니다.

한 가지 공통적 인 접근 방식은 두 개의 파일 핸들을 입력 파일에, 다른 파일 핸들을 새 출력 파일에 열려는 것입니다. 따라서 한 번에 한 줄씩 파일을 처리하기가 쉽습니다.

while (<$input_fh>) { 
    if (this is a line you need to change) { 
    # make changes to line (which is in $_) 
    # Perhaps print an extra line here. 
    } 
    print $output_fh $_; 
} 

(사용의 용이성을 위해 속도를 거래) 또 다른 방법은 (5.8 보낸 모든 펄 분포의 일부)를 Tie::File 모듈을 사용하는 것이다.

항상 그렇듯이 Perl FAQ은 더 많은 정보가 필요합니다. 이미 한 (약간 문제가) 타이 :: 파일 기반 솔루션을 :이 경우, 당신은 아마 질문 How do I change, delete, or insert a line in a file, or append to the beginning of a file?

업데이트가 포함되어 perlfaq5,보고 싶다. 그래서 여기 내 꺼야 :

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tie::File; 

tie my @lines, 'Tie::File', 'somefile.txt' 
    or die "Can't tie file: $!\n"; 

for (@lines) { 
    $_ .= "\nTEST line" if $_ eq 'second line'; 
} 
+0

나는 기존의 라인을 바꾸고 싶지 않다. 새 줄을 추가해야합니다 – Beginner

+0

출력을 출력하고 싶습니다. 파일에 줄을 삽입해야합니다. – Beginner

+0

@Beginner Dave가 여기에 정확히 설명했습니다. 아마도 여러분은 [perl을 배우는 것으로] 시작해야 할 것 같습니다 (http : // perl-begin.org /) 그리고 아마도 여러분은 여기에서 말한 것을 더 이해할 것입니다. –

0

당신은

use Tie::File; 

my $inputFile = "test.txt"; 

my @array; 
tie @array, 'Tie::File', $inputFile or die "Error: Couldn't tie the \"$inputFile\" file: $!"; 
my $len = join "\n", @array; 

if($len=~m/second line/i) { $len=~s/second line/$&\nTEST Line/ig; } 

@array = split/\n/, $len; 
untie @array; 

Tie::File는 같은 입력 파일에 문자열을 대체 할 것으로 예상 무슨 Tie::File 출력을 얻을 수 있습니다 사용할 수 있습니다.

+0

1. 여기서'또는'대신'||'를 사용하면 우선 순위 문제가 발생할 수 있습니다. 2.'join'과'split'을 사용하는 것은 아주 이상한 접근 방법입니다. 3. 라인을 추가하지 않았 으면, 그것을 덮어 썼습니다. –

+0

@DaveCross : 답변에서 # 1이 업데이트됩니다. # 2. 나는 코드에서'join/split' 대신에 어떻게 바꾸는 지 모른다. #삼. _Tie :: File은 동일한 입력 파일의 문자열을 바꿉니다. _ 나는 이것을 언급했습니다. – ssr1012

+0

대체를's/second line/second line \ nTEST line /'으로 바꾸면 해결할 수 있습니다. 현재 귀하의 대답은 @beginner가 요구 한 바를 수행하지 않습니다. 나는 왜 그가 그것을 받아 들일지 전혀 모른다. –