파일 B의 레이블을 파일 A의 값으로 대체

파일 B의 레이블을 파일 A의 값으로 대체

Perl에 대한 도움을 찾고 있습니다. 대부분의 코드를 작성했지만 특히 어려운 부분이 하나 있습니다.

파일 A의 경우:

tag1=value1
tag2=value2

파일 B:

value1=<tag1>
value2=<tag2>

의사코드:

open file 1
open file 2
 read line of data from file 1 while data exists
   change the equal sign to a space ( tag1=value1 becomes tag1 value1)
   separate the line into two variables

[여기서 마법이 일어난다FileB의 값을 FileA의 실제 값으로 변경합니다(아래 예 참조).

close file 2
close file 1

그래서 저는 몇 가지를 시도하고 Google 삼촌(및 여기)을 통해 문제를 조사했습니다. 단일 명령줄을 사용하여 이 작업을 수행하는 쉬운 방법이 있다는 것을 알고 있습니다(

prompt> gawk '{sub(/=/," ")}1' [path]/[FileA] | 
    gawk '{system ("perl -pi -e \x27s/"$1"/"$2"/g\x27 [path]/[FileB]")}' 

), 그러나 나는 그렇게 하고 싶지 않고 대신 내 Perl 프로그램에서 그것을 구현하려고 노력합니다. 왜냐하면 나는 일을 더 어렵게 만드는 것을 좋아하기 때문입니다. :-p.

예를 들어 FileA에 다음이 포함되어 있는 경우

<tag1>=192.192.2.3
<tag2>=5400

FileB에는 다음이 포함됩니다.

connect IP=<tag1>
connect port=<tag2>

이 프로그램이 끝나면 FileB에 다음을 포함하고 싶습니다.

connect IP=192.192.2.3
connect port=5400

프로그램에서 교체를 수행하는 방법을 이해하지만 파일을 업데이트하는 데 문제가 있습니다.

어떤 조언이라도 환영합니다. 완벽한 솔루션이 필요하지도 않고 올바른 방향을 알려줄 수 있는 정보만 있으면 됩니다.

이것은아니요숙제.

답변1

첫 번째 파일의 데이터를 기반으로 해시 테이블을 만든 다음 이를 사용하여 두 번째 파일을 수정하려는 것 같습니다. 대략적으로 말하면, 이것은 당신에게 몇 가지 아이디어를 줄 수 있습니다.

my %my_tags;

while (<$fh1>) {
    chomp;
    my ($tag, $value) = split /=/;
    $my_tags{$tag} = $value;
}

while (<$fh2>) {
    s/(\w+)=(\S+)/$1=$my_tags{$2}/;
    print;
}

대체 마법이 더 필요하다면 /e평가 플래그 사용 방법을 확인하세요.

답변2

이 경우 다음을 수행합니다.

read the tag-file (A) into a hash %tag
read the text-file into an array @text
for keys tag-hash 
    substitute all tags in the array

write the array @text to the textfile

또는:

#!/usr/bin/perl
use strict;

my @text;
my %tags;
open (my $TAGS,'<',"fileA") or die "horribly";
while(<$TAGS>){
    if (/<(.*)>=(.*)/){
        $tags{$1}=$2;
    }
}
close $TAGS;
open (my $TXT,'<',"fileB") or die "no B";
@text=<$TXT>;
close $TXT;

for my $key (keys %hash) {
    for (@text){
        s/<$key>/$tags{$key}/;
    }
}

open (my $TXT,'>',"fileB") or die "cannot write a bee";
for (@text){
    print $TXT $_;
}

이 코드는 테스트 없이 작성되었습니다. 최소한 새 줄을 살펴보아야 합니다. 이는 지저분할 수 있습니다. 하지만 당신은 "완벽한 해결책조차 필요하지 않습니다. 단지 올바른 방향을 알려주는 것뿐입니다."라고 말씀하셨습니다.

답변3

Perl 명령줄 옵션을 사용하는 한 가지 방법은 준-awk 방식으로 실행되도록 만드는 것입니다. 다음에서 읽을 수 있습니다 perldoc perlrun.

perl -F= -lane '
  @ARGV and %h=(%h,@F),next;
  print s|=\K.*|$h{$&}//$&|re; 
' fileA fileB

connect IP=192.192.2.3
connect port=5400

답변4

다들 감사 해요! 나는 (동료들의 도움을 받아) 내가 생각한 대안을 배울 수 있도록 귀하의 예를 시도해 보겠습니다.

System("sed -is/'${var_one}'/'${var_two}'/g $outfile1");

명확성을 위해 $var_one 및 $var_two는 "행을 두 개의 변수로 분할" 단계에서 가져온 것입니다.

다시 한번 감사드립니다.

평화, 클라크 "더 드래곤" 윌리스

관련 정보