2016-07-19 12 views
0

Ich muss eine bestimmte Zeile in einer Konfigurationsdatei aktualisieren. Die Zeile, die ich aktualisieren muss, ist unten. Ich möchte das Feld SERVICE_NAME = OriginalValue mit SERVICE_NAME = NewVaule aktualisieren. Leider ist der 'OriginalValue' keine feste Zeichenfolge. Es besteht aus alphabetischen Zeichen (oben und unten), Zahlen und Punkten.Aktualisieren Sie eine Zeile in der Konfigurationsdatei von Bash-Skript mit sed/awk oder anderen Tool

Auch die SERVICE_NAME ist in mehreren Zeilen und ich möchte nur die Zeile aktualisieren, die jdbc_url enthält.

Der Artikel, den ich ausprobiert habe, ist unten, aber ich muss nur bis zur ersten Klammer ersetzen.

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

Ich bin mir nicht sicher, wie es weitergeht. Die einzige Voraussetzung ist, dass der Befehl von bash ausführbar ist und Tools verwendet, die sich in einer vernünftigen Linux-Distribution befinden.

+1

Diese etwa so einfach wie 'sed' Befehle erhalten. Wie konntest du nicht einmal nahe kommen? – Barmar

+0

Hinzufügen von Kontext: Der SERVICE_NAME ist in mehreren Zeilen und ich möchte nur die Zeile aktualisieren, die jdbc_url enthält. – Rajesh

+1

Setzen Sie das in die Frage. Die Lösung besteht darin, einen Adressausdruck zu verwenden, der dem Kontext vor dem 's ///' -Befehl entspricht. – Barmar

Antwort

2

Wenn Sie diese für ein Skript suchen, sagen config_editor tun würde:

#!/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 

Run als

./config_editor new_value /path/to/config_file 
+1

Perfekt. Vielen Dank! – Rajesh

+0

Können Sie mir helfen, die Notwendigkeit der Klammer um SERVICE_NAME = zu verstehen? – Rajesh

+0

Es ist für die Wiederverwendung eines übereinstimmenden Musters - siehe '\ 1', die folgt. Zum Beispiel 's/(stuff1) stuff2 (stuff3)/\ 1 \ 2 /' würde nur 'stuff2' löschen,' \ 1' steht für das erste übereinstimmende Muster und '\ 2' steht für die zweite und so weiter. – sjsam

1

Um eine Ersetzung nur in Zeilen durchzuführen, die einem Muster entsprechen, verwenden Sie das Muster als Adressausdruck für den Ersetzungsbefehl.

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