Grab data between 2 keywords any do an array operation and write the file intact

Hi Unix Gurus,

I need to grep for a block that is between a start and end keyword and then in between I need to find and replace a keyword.

for eg: I need to search between

Test   = 000;

and

Test   = 000;

and find

K9

and replace with

M9

INPUT FILE

Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}

Require OUTPUT FILE

Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = M9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = M9;
Test      = 000;
Regular  = 00;
}

Appreciate your help
And thanks in advance

Hi

 sed  '/Test      = 000;/,/Test      = 000;/s/K9/M9/' file

Guru

Hi Guruprasad,

What if I have 100's of such back to back blocks. I guess it will only find the first and last occurrence of test.

Can you suggest something that searches for every pair of Test statements and replaces K9 with M9?

Thanks

Try:

awk '/Define/{print x}1' infile | awk '{if($8=="000;"){if(p)sub($5,"M9;"); p=1}else p=0}1' RS= ORS='\n\n' 

Could you explain what $8 and $5 do? The cmd is not working for me

What OS and version are you using? On Solaris use /usr/xpg4/bin/awk rather than awk

# awk 'NR==1{if($0!~/Test/)print;else x=$0;}NR!=1{x=x $0;while(getline){if($0~/Replace/)sub($0,$0 i++);x=x?x"\n"$0:$0;;if(x~/Test.*Test.*$/)break};
if(x~/Test      = 000[0-9]*.*Test      = 000[0-9]*;/){sub("K9;"i-1,"M9;",x)};gsub("K9;[0-9]*","K9;",x);;sub(xx,"",x);print x;
x=gensub(".*(Test.*;)","\\1",x);;xx=x}' file
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = M9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 00;
}
Define {
Replace  = K9;
Test      = 000;
Regular  = 00;
}
Define {
Replace  = M9;
Test      = 000;
Regular  = 00;
}

lets try another same file..

# cat filesame
Define {
Replace  = K9;
Test      = 0001;
Regular  = 001;
}
Define {
Replace  = K9;
Test      = 0002;
Regular  = 002;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 003;
}
Define {
Replace  = K9;
Test      = 0003;
Regular  = 004;
}
Define {
Replace  = K9;
Test      = 0004;
Regular  = 005;
}
Define {
Replace  = K9;
Test      = 0005;
Regular  = 006;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 007;
}
# awk ...... [same code ] samefile
Define {
Replace  = K9;
Test      = 0001;
Regular  = 001;
}
Define {
Replace  = M9;
Test      = 0002;
Regular  = 002;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 003;
}
Define {
Replace  = K9;
Test      = 0003;
Regular  = 004;
}
Define {
Replace  = M9;
Test      = 0004;
Regular  = 005;
}
Define {
Replace  = M9;
Test      = 0005;
Regular  = 006;
}
Define {
Replace  = K9;
Test      = 111;
Regular  = 007;
}

regards
ygemici