2013-05-24 2 views
1

I asked this question before하지만 실제로 답변을 기반으로 제대로 설명했다고는 생각하지 않습니다.다른 파일의 목록에있는 파일의 텍스트를 바꿉니 까?

나는 파일이 backup.xml인데,이 파일의 길이는 28,000 줄이며 그 안에 ***이라는 문구가 766 번 있습니다. 나는 또한 list.txt이라는 파일을 가지고 있는데,이 파일에는 각각 766 개의 줄이 들어 있으며 각 줄마다 다른 키워드가 있습니다.

내가 기본적으로해야 할 일은 list.txt에서 backup.xml으로 각각의 줄을 삽입하는 것입니다. 766 자리를 바꾸려면 ***이 언급되어 있습니다.

<title>*** Hosting Services - Company Review</title> 

따라서, 예를 들어, 첫 번째 줄 : 여기 backup.xml에서 그것에 ***와 라인 중 하나의 예입니다

Anaheim 
Anchorage 
Ann Arbor 
Antioch 
Apple Valley 
Appleton 

: 여기

list.txt에 포함되어 있는지의 예 언급 된 ***이 위의 샘플에 따라이 값으로 변경되어야합니다.

<title>Anaheim Hosting Services - Company Review</title> 

도움을 주시면 감사하겠습니다. 미리 감사드립니다! 이것에 대해

+0

모든 입력의 예 및 바람직한 출력? –

+0

방금 ​​업데이트 된 질문입니다. – user2410854

+0

나는 먼저 이전 질문을 보았다. 내 대답이 적절합니다. –

답변

1

이 경우 XML을 순수 텍스트로 처리 할 수 ​​있습니다. 그래서 XML 파일을 읽고, 키워드 파일에서 읽기 라인 마커의 각 항목을 바꾸 : awk를 사용

#!/usr/bin/perl 

use strict; 
use warnings; 

use autodie qw(open); 

my $xml_file = 'backup.xml'; 
my $list_file = 'list.txt'; 
my $out_file = 'out.xml'; 

my $pattern='***'; 

# I assumed all files are utf8 encoded 
open(my $xml, '<:utf8', $xml_file ); 
open(my $list, '<:utf8', $list_file); 
open(my $out, '>:utf8', $out_file ); 

while(<$xml>) 
    { s{\Q$pattern\E}{my $kw= <$list>; chomp $kw; $kw}eg; 
    print {$out} $_; 
    } 

rename $out_file, $xml_file; 
+1

왜'print {$ out} $ _; '에 중괄호가 붙는가 –

+1

'$ out'을 파일 핸들로 사용하는지 확인합니다. 그것들은 여기에 필요하지는 않지만 어쨌든 나는 그것을 사용한다. 독자가'print'가'$ out'과 짝을 이루는 것을보다 분명하게 알게된다. – mirod

0

방법 :

첫 번째 줄은 검색 목록을 만들기 위해 awk을 사용
awk '{print NR-1 ",/\\*\\*\\*/{s/\\*\\*\\*/" $0 "/}"}' list.txt > list.sed 
sed -f list.sed backup.xml 

/다음 sed를 통해 다음 줄에 실행되는 목록에 따라 명령을 교체합니다.

0

. backup.xml 파일을 읽고 *** 텍스트를 발견하면 list.txt 파일에서 단어를 추출합니다. BEGIN 블록은 처리를 피하기 위해 인수 목록에서 을 제거합니다. 논쟁의 순서는 매우 중요합니다. 또한 라인 당 하나의 *** 문자열 만 있다고 가정합니다. 두 파일이 순차적으로 해당하는 경우

awk ' 
     BEGIN { listfile = ARGV[2]; --ARGC } 
     /\*\*\*/ { 
       getline word <listfile 
       sub(/\*\*\*/, word) 
     } 
     1  ## same as { print } 
' backup.xml list.txt 
0

, 당신은 파일 후 후 공정 모두에서 라인을 가입 paste 명령을 사용할 수 있습니다.

Anaheim \t <title>*** Hosting Services - Company Review</title> 

AWK의 한 라이너 (첫 번째 필드, 후속하여 제 1 필드와 필드 분리 제거하여 *** 대체 반면 \ t :

paste list.txt backup.xml | 
awk 'BEGIN {FS="\t"} {sub(/\*\*\*/, $1); print substr($0, length($1)+2)}' 

페이스트 명령은 다음 생산할 예정) 후에.

다른 변형은 :

paste list.txt backup.xml | 
awk 'BEGIN {FS="\t"} {sub(/\*\*\*/, $1); print $0}' | 
cut -f 2- 
+1

질문에서 두 파일의 줄 수가 같아서 붙여 넣기가 작동하지 않는다고 가정 할 수 없습니다. –

+0

그래서 'if'문으로 시작했습니다. –

관련 문제