Need help in correcting sed script

Hi All,

I have a big configuration log where I want to change string "aaa" to "bbb" under
auto-config-policy only right after "deny", "accept" and "hold" strings, nowhere else.

<<<< text >>>>>

auto-config-policy test
     deny aaa precedence 4 profile aaa any  
     deny aaa precedence 6 domain aaa
     accept aaa precedence 4 profile aaa any
     hold aaa precedence 4 profile aaa any

auto-upgrade-policy  test2
     upgrade aaa precedence 4 profile default-aaa any  
     upgrade aaa precedence 6 domain default vlan 345 
     upgrade aaa precedence 4 profile default-aaa any

<<<<<text>>>>

To do that I have used the following sed script.

#!/bin/sh

OLD_STRING1="deny aaa precedence"                                                                               
NEW_STRING1="deny bbb precedence"                                                                               
OLD_STRING2="accept aaa precedence"                                                                               
NEW_STRING2="accept bbb precedence"   
OLD_STRING3="hold aaa precedence"                                                                               
NEW_STRING3="hold bbb precedence"                                                                                                                                                         
CONFIG_FILE=/tmp/conf.log

fix()                                                                   
{

  if [ ! -e $CONFIG_FILE ] ; then
     echo "file not present"
     return 1
  fi 
                       
  if [ -r $CONFIG_FILE ] ; then   
    sed <$CONFIG_FILE -e "s/$OLD_STRING1/$NEW_STRING1/g" -e "s/$OLD_STRING2/$NEW_STRING2/g" -e "s/$OLD_STRING3/$NEW_STRING3/g" > /tmp/a-$$
    mv /tmp/a-$$ $CONFIG_FILE
  fi 
}
 
fix 

Can any body help me in correcting/updating the script. Only shell scripting needs to be used for this purpose.

Thanks.............

You can accomplish the task with a single sed command:

sed -i.BKUP '/^auto-config-policy/,/^hold/s/aaa/bbb/' conf.log

cat conf.log
auto-config-policy test
deny bbb precedence 4 profile aaa any
deny bbb precedence 6 domain aaa
accept bbb precedence 4 profile aaa any
hold bbb precedence 4 profile aaa any

auto-upgrade-policy test2
upgrade aaa precedence 4 profile default-aaa any
upgrade aaa precedence 6 domain default vlan 345
upgrade aaa precedence 4 profile default-aaa any

cat conf.log.BKUP
auto-config-policy test
deny aaa precedence 4 profile aaa any
deny aaa precedence 6 domain aaa
accept aaa precedence 4 profile aaa any
hold aaa precedence 4 profile aaa any

auto-upgrade-policy test2
upgrade aaa precedence 4 profile default-aaa any
upgrade aaa precedence 6 domain default vlan 345
upgrade aaa precedence 4 profile default-aaa any

Hi,

Thanks for helping me. But unfortunately your sed command is replacing "aaa" on other places also. see in red colors. I want to change "aaa" string only between "auto-config-policy test"
and "auto-upgrade-policy test2" . That to between deny/accept/hold and "precedence" (see in orange color) nowhere else.

<<<< text >>>>>

auto-config-policy test
      deny aaa precedence 4 profile aaa any 
      deny aaa precedence 6 domain aaa
      accept aaa precedence 4 profile aaa any
      hold aaa precedence 4 profile aaa any

auto-upgrade-policy test2
      upgrade aaa precedence 4 profile default-aaa any 
      upgrade aaa precedence 6 domain default vlan 345 
      upgrade aaa precedence 4 profile default-aaa any

upgrade-profile aaa default-aaa
      autoupgrade configuration
      autoupgrade firmware

aaa  00:11:AA-DD-CC-AA
        use upgrade default-aaa
        use config   defautl-aaa

<<<<<text>>>>

Thanks.............

sed -i.BKUP '/^auto-config-policy/,/^auto-upgrade-policy/ s/ aaa precedence/ bbb precedence/' conf.log

@temp.sha: What wasn't working with your original script in post #1?

--edit-- Did you mean to simplify your script? Can it be awk also? like e.g.:

awk '$1~/^(deny|accept|hold)$/ && $2==a {$2=b}1' a=aaa b=bbb "$CONFIG_FILE"