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
naveen
3
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