在网上看到一个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之前的换行等空格保留。否则格式不对。