perl實現的一個模式替換題目

在網上看到一個perl模式匹配的題目,自己試了下結果,留個底:

以下是一個文件的一部分:
block1
    LAYER1
        a0=56, b0=147.345989944561, c0=11.0225098942223
        a1=76, b1=174.434168420681, c1=253.89644118973
        a2=42, b2=117.774925865152, c2=182.422622167185
    LAYER2
        a0=48, b0=164.391521356056, c0=243.612268442083
        a1=56, b1=56.3028265552006, c1=67.3497698774622
        a2=17, b2=182.182082410397, c2=265.689705668802
block2
    LAYER1
        a0=13, b0=98.5005938116799, c0=193.432038047288
        a1=32, b1=173.682215090149, c1=284.746973938173
        a2=80, b2=77.3396633455278, c2=45.913625227217
    LAYER2
        a0=89, b0=6.78883867591011, c0=181.63053325133
        a1=35, b1=51.962410302621, c1=114.479466051294
        a2=57, b2=88.5057901717936, c2=119.906443042102
    LAYER3
        a0=22, b0=135.172781428776, c0=180.32730953417
        a1=89, b1=38.4925211497517, c1=171.120129693275
        a2=53, b2=102.546819074468, c2=235.02212266283
        a3=5, b3=46.5476781394699, c3=69.2620776701364
block3  
     ..........
     ..........
要求利用perl,shell,tcl等語言將block2中的LAYER1和LAYER2中的內容替換爲NEED TO REBUILD,替換後如下:

block1
    LAYER1
        a0=56, b0=147.345989944561, c0=11.0225098942223
        a1=76, b1=174.434168420681, c1=253.89644118973
        a2=42, b2=117.774925865152, c2=182.422622167185
    LAYER2
        a0=48, b0=164.391521356056, c0=243.612268442083
        a1=56, b1=56.3028265552006, c1=67.3497698774622
        a2=17, b2=182.182082410397, c2=265.689705668802
block2
    LAYER1
        NEED TO REBULID
    LAYER2
        NEED TO REBULID
    LAYER3
        a0=22, b0=135.172781428776, c0=180.32730953417
        a1=89, b1=38.4925211497517, c1=171.120129693275
        a2=53, b2=102.546819074468, c2=235.02212266283
        a3=5, b3=46.5476781394699, c3=69.2620776701364
block3  

     ..........


我的腳本代碼如下:

use File::Slurp;

$filename = "/test/match.txt";
$content  = read_file($filename);

$content =~ s/(block2\s+LAYER1\s+).+?(\s+LAYER2\s+).*?(\s+LAYER3)/$1NEED TO REBUILD$2NEED TO REBUILD$3/is;

print "after:\n$content\n";


一定要注意在LAYER2和LAYER3前面的\s+以及.+後面的?(不貪婪匹配),這是爲了保證在替換後,LAYER2和LAYER3之前的換行等空格保留。否則格式不對。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章