如何用sed替换特定单词后的UNKNOWN Word?

时间:2017-03-24 08:05:15

标签: bash sed

我有一个名为const.lib的文件,其中包含参数和密码。 我的文件如下所示,我希望我的DB-admin更新分配给参数vORAPASS的密码(我不知道),而无需手动编辑我的文件。

if [[ $ZONE = "developement" ]]
 then

 declare -rx vLEVEL=DEV

    declare -rx vORACONSTR=run.dev.zone
    declare -rx vSORAUSER=master
    declare -rx vORAPASS=KNOWNPASSWD
    declare -rx vORASCHEME=master
        ...


elif [[ $ZONE = "test" ]]
 then

 declare -rx vLEVEL=TINT

    declare -rx vORACONSTR=run.tint.zone
    declare -rx vSORAUSER=master
    declare -rx vORAPASS=UNKNOWNPASSWD
    declare -rx vORASCHEME=master


elif [[ $ZONE = "production" ]]
 then

  declare -rx vLEVEL=PROD

    declare -rx vORACONSTR=run.prod.zone
    declare -rx vSORAUSER=master
    declare -rx vORAPASS=UNKNOWNPASSWD
    declare -rx vORASCHEME=master
       ...

fi

我如何使用sed来改变第三次出现? 提前THX:)

2 个答案:

答案 0 :(得分:1)

使用sed和反向引用:

sed -r 's/(vORAPASS)(=.*)/\1=MY_NEW_PASS/' const.lib

或者没有回复:

sed 's/vORAPASS=.*/vORAPASS=MY_NEW_PASS/' const.lib

或使用awk

awk 'BEGIN{FS=OFS="="}/vORAPASS/{$2="NEW_PASS"}1' const.lib

替换vORAPASS的第三次出现您可以使用:

awk '/vORAPASS/{c++ ;if(c == 3) gsub(/vORAPASS=.*/,"vORAPASS=MY_NEW_PASS")}1' const.lib
declare -rx vORACONSTR=run.prod.zone
declare -rx vSORAUSER=master
declare -rx vORAPASS=UNKNOWNPASSWD #<----------1st its not
declare -rx vORASCHEME=master
declare -rx vORAPASS=UNKNOWNPASSWD #<----------2nd its not
declare -rx vORAPASS=MY_NEW_PASS   #<---------3rd replaced

进行原地替换:检查您的awk版本,在版本4+中支持原位置换sed。如果awk中没有现场替换,则:

awk '/vORAPASS/{c++ ;if(c == 3) gsub(/vORAPASS=.*/,"vORAPASS=MY_NEW_PASS")}1' const.lib > temp && mv temp const.lib

答案 1 :(得分:0)

@PS,谢谢你的支持,我的问题现在已经彻底解决了:)