2016-07-19 14 views
0

我必須更新配置文件中的特定行。我需要更新的路線如下。我想用SERVICE_NAME = NewVaule更新字段SERVICE_NAME = OriginalValue。不幸的是,'OriginalValue'不是一個固定的字符串。它由字母(上和下),數字和句點組成。使用sed/awk或其他工具從bash腳本更新配置文件中的一行

此外,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> 
+1

這是關於那樣簡單'sed'命令得到。你甚至不能靠近嗎? – Barmar

+0

添加上下文:SERVICE_NAME在幾行上,我只想更新其中包含jdbc_url的行。 – Rajesh

+1

把這個問題。 Tha的解決方案是使用一個地址表達式來匹配's ///'命令之前的上下文。 – Barmar

回答

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

完美。謝謝! – Rajesh

+0

你能幫我理解一下SERVICE_NAME =的括號嗎? – Rajesh

+0

它用於重用匹配模式 - 請參閱後面的'\ 1'。例如's /(stuff1)stuff2(stuff3)/ \ 1 \ 2 /'只會刪除'stuff2','\ 1'表示第一個匹配模式,'\ 2'表示第二個等等。 – sjsam

1

要僅在與模式匹配的行上執行替換,請使用該模式作爲替換命令的地址表達式。

sed '/jdbc_url/s/SERVICE_NAME=OriginalValue/SERVICE_NAME=NewVaule/' filename 
相關問題