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는 "행을 두 개의 변수로 분할" 단계에서 가져온 것입니다.
다시 한번 감사드립니다.
평화, 클라크 "더 드래곤" 윌리스