使用sed / awk或其他工具从bash脚本更新配置文件中的一行

时间:2016-07-19 20:16:40

标签: bash awk sed

我必须更新配置文件中的特定行。我需要更新的行在下面。我想用SERVICE_NAME = NewVaule更新字段SERVICE_NAME = OriginalValue。不幸的是,' OriginalValue'不是固定的字符串。它由字母字符(上部和下部),数字和句点组成。

此外,SERVICE_NAME位于多行,我只想更新其中包含jdbc_url的行。

我试过的项目如下,但我只需要替换第一个括号。

sed -i '/s_apps_jdbc_connect_descriptor/s/SERVICE_NAME.*)/SERVICE_NAME=NewValue/' work.xml

我不知道该怎么办。唯一的要求是该命令可以从bash执行,并使用合理的Linux发行版中的工具。

<jdbc_url oa_var="s_apps_jdbc_connect_descriptor">jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=YES)(FAILOVER=YES)(ADDRESS=(PROTOCOL=tcp)(HOST=myhostname.com)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=OriginalValue)))</jdbc_url>

2 个答案:

答案 0 :(得分:2)

如果你正在寻找一个脚本,请说config_editor会这样做:

#!/bin/bash
# $1 - new value $2 - /path/to/config_file
if [ ! "$#" -eq 2 ]
then
  echo "Usage : ./config_editor new_value /path/to/config_file"
  exit 1
elif [ ! -e "$2" ]
then
  echo "Config file doesn't exist, please check the path"
  exit 1
fi
sed -Ei.bak '/^<jdbc_url/{s/(SERVICE_NAME=)[^)]*\)/\1'"$1"'\)/}' "$2"
# -E enables extended regex for sed, a bit more portable than -r
# -i enables inplace edit but do keep a backup of the original file
# .bak with -i appends a suffix .back to the backup file

将其作为

运行
./config_editor new_value /path/to/config_file

答案 1 :(得分:1)

要仅对与模式匹配的行执行替换,请使用模式作为替换命令的地址表达式。

sed '/jdbc_url/s/SERVICE_NAME=OriginalValue/SERVICE_NAME=NewVaule/' filename