Как заменить строку в файле с помощью Perl? - PullRequest
0 голосов
/ 10 февраля 2012

Как мне изменить содержимое файла из этого:

setenv api1000 Delhi
setenv CODEDROP regular
setenv RELEASETYPE build
setenv CDBUILD CD30

К этому (заменяется строка обычная на CD29 во второй строке)

setenv api1000 Delhi
setenv CODEDROP CD29
setenv RELEASETYPE build
setenv CDBUILD CD30

моя попытка:

my $CD_VER = CD29;

open RF, "<$OldFile" or die "Cannot open $OldFile for reading.";
open WF, ">$NewFile" or die "Cannot open $NewFile for writing.";

while ( <RF> ) {
    if (/CODEDROP/){
        if( /regular/) {
            $_ =~ s/regular/$CD_VER/ ;
            print WF "$_";      
        }
    }

close RF;
close WF;

copy("$NewFile","$OldFile");  # both became same

ВЫХОД Я получаю, как показано ниже в файле назначения:

setenv api1000 Delhi
setenv CODEDROP regular   ( I NEED  to REMOVE this LINE )
setenv CODEDROP CD29       ( only this line should be there )
setenv RELEASETYPE build
setenv CDBUILD CD30

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Если это все, что он делает, то вы можете сделать это как однострочник:

perl -pe 's:(\bCODEDROP\s+)regular:$1CD29:' oldfile > newfile

Если хотите, вы можете даже отредактировать файл на месте:

perl -i.bak -pe 's:(\bCODEDROP\s+)regular:$1CD29:' oldfile
2 голосов
/ 10 февраля 2012

Единственная проблема с вашим кодом заключалась в том, что вы печатали строку в новый файл в неправильном месте цикла.Вам нужно напечатать каждую строку из старого файла в новый файл.

Немного прибравшись к вашему файлу и обновив некоторые идиомы, я получаю следующее:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my $old_file = 'in.txt';
my $new_file = 'out.txt';

my $CD_VER = 'CD29';

open my $rf, '<', $old_file or die "Cannot open $old_file for reading.";
open my $wf, '>'. $new_file or die "Cannot open $new_file for writing.";

while ( <$rf> ) {
    if (/CODEDROP/ and /regular/) {
        s/regular/$CD_VER/ ;
    }
    print $wf $_;
}

close $rf;
close $wf;
1 голос
/ 10 февраля 2012
while (<RF>) {
    if (/CODEDROP\s+regular/) {
        $_ =~ s/regular/$CD_VER/ ;
    }
    print WF "$_";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...