如何在特定范围的文本中搜索模式并替换为另一个字符串?

时间:2013-10-10 04:35:42

标签: perl

$ NAME : corry   
$$.Inc s d  
$$.Oc s 
$$.TO

G1 ty n1 EE EE M T1 T2 $$SRU   
G2 n1 y OO OO M T3 T4 $$SRU   
.EON  

$ NAME : patrick  
$$.Inc c d
$$.Oc c 
$$.TO 

G1 td n3 EE EE M T5 T6 $$SRU    
G2 n3 y OO OO M T7 T8 $$SRU  
.EON


$ NAME : danny

$$.Inc a b 
$$.Oc b
$$.TO 

@lc1 corry 
@lc2 patrick
1 to n0 EE EE M S1 S2 $$SRU
G2 n0 y OO OO M S3 S4 $$SRU   
.EON

$ NAME : sandy    
$$.Inc m n   
$$.Oc n
$$.TO   

G1 te n1 EE EE M b1 b2 $$SRU    
G2 n1 o OO OO M b3 b4 $$SRU    
.EON     


$ NAME : manager   
$$.Inc o e
$$.Oc e      
$$.TO    

@lc3 danny      
@lc4 sandy     
G1o ty n1 EE EE M T1 T2 $$SRU    
G2o n1 y OO OO M T3 T4 $$SRU   
.EON

如何在特定范围内搜索某种模式?例如,我想在G1o部分到$ Name : manager部分之间的范围内搜索End of name (.EON),并将其替换为G1o.corry.n

2 个答案:

答案 0 :(得分:1)

perl -pe 's/G1o/G1o.corry.n/ if /\$ NAME : manager/ .. /\.EON/' file

来自perlop文档:

  

在标量上下文中,“..”返回一个布尔值。运算符是双稳态的,就像一个触发器,并模拟sed,awk和各种编辑器的行范围(逗号)运算符。每个“..”运算符都保持自己的布尔状态,甚至在调用包含它的子例程时也是如此。只要其左操作数为假,它就是假的。

答案 1 :(得分:0)

sed '/^\$ NAME : manager/,/\.EON/s/G1o/G1o.corry.n/'