2017-09-16 55 views
0

您好我想在一個文件中替換字符串,test.txt的:Perl,以這樣的字符串替換特定塊中的字符串的文件

<g 
    id="g16526"> 
    <g 

    <g 
    id="gnnnnn"> 
    <g 

,並使用他們變成

<g 
    id="gg1"> 
    <g 
    ... 
    <g 
    id="ggn"> 
    <g 

這個perl腳本

#!C:/Strawberry/perl 
    open(FILE, "<test.txt") || die "File not found"; 
    my @lines = <FILE>; 
    close(FILE); 
    my $string = '<g 
    id='; 
    my $string2 = '<g 
    <g'; 
    my $anything = ".*"; 

    my $replace = 'gg'; 
    my @newlines; 
    my $counter = 1; 

    foreach(@lines) { 
     $_ =~ s/\Qstring$anything\Q$string2/$string$replace$string2$counter/g; 
     $counter++; 
     push(@newlines,$_); 
    } 

    open(FILE, ">test.txt") || die "File not found"; 
    print FILE @newlines; 
    close(FILE); 

,但它不工作,任何建議表示讚賞

+0

什麼類型的文本文件?如果是XLM - 您應該使用XML :: Simple來獲取id值並將其替換。 – ilux

+1

@ilux Re:「_you should use XML :: Simple_」。 「XML :: Simple」已被棄用,甚至自己的文檔建議不要使用它,原因很多。它在很久以前就有它的地位和重要性,但它現在不應該使用。標準是'XML :: LibXML'和'XML :: Twig'。 – zdim

+0

謝謝@ilux Re,XML :: LibXML或XML :: Twig是解決方案。 – user1420482

回答

1

如果這看起來確實具有類似於XML的結構,則應該使用模塊進行處理,即XML::LibXMLXML::Twig

但這個任務所示的基本方式是很容易做到,以及

perl -0777 -wpE' 
    BEGIN { $cnt = 0 }; 
    s/<g\nid="g\K(.*?)"/q(g).(++$cnt).q(")/eg; 
' input.txt 

其預期的文件格式是完全如圖所示。它通過-0777將整個文件讀取到一個字符串中,它不是最漂亮的,可能不適用於非常大的文件。

另一種方法是將記錄分隔符設置爲<g,使每一個「行」是處理

perl -wpE' 
    BEGIN { local $/ = "<g"; $cnt = 0 }; 
    s/id="g\K(.*?)"/q(g).++$cnt.q(")/eg; 
' t.txt 

這裏現在正則表達式是免費尋求精確id="..."塊,我們可以處理線逐線。

這些都打印預期的輸出。他們在單線測試中更容易測試,我建議轉成腳本。