2013-12-13 2 views
22

Ich habe online nach dieser Antwort gesucht und kann es nicht finden.Wie sed verwenden, um die Variable einer Konfigurationsdatei zu ersetzen?

Ich habe eine Konfigurationsdatei, die enthält:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

Und ich will VAR5 Wert von Wert5 zu VALUE10 ändern. Leider kenne ich den Wert von VALUE5 nicht, so dass ich nicht danach suchen kann. Also im Grunde muss ich sed (oder was auch immer) verwenden, um den Wert von VAR5 zu jedem Wert zu ersetzen, mit dem ich es ersetzen möchte.

Bearbeiten: Dank der bestätigten Lösung konnte ich die folgenden in BASH verwenden, um meine Konfigurationsdatei zu bearbeiten, indem Sie ein Argument in das Bash-Skript übergeben. Die Schrägstriche wurden durch Kommas ersetzt, da der Parameter, den ich an das Skript übergebe, Schrägstriche enthält.

sed -i 's,^\(THISISMYVARIABLE=\).*,\1'THISISMYVALUE',' config.cfg 

Meine Datei enthalten:

THISISMYVARIABLE=SOMEOLDVALUE 

Nach dem sed Befehl in bash

THISISMYVARIABLE=THISISMYVALUE 
+0

Woher kommt "VALUE10"? Kommt es von einer anderen Zeile in derselben Datei? Oder ist es nur ein beliebiger Wert? – Sildoreth

+0

VAR5 in meiner Konfigurationsdatei ist USER_INSTALL_DIR und VALUE10 ist alles, es könnte Müll sein. Ich möchte VAR5 oder in meinem Fall USER_INSTALL_DIR auf eine Variable setzen, die ich über ein Bash-Skript an es übergebe. Das Folgende funktionierte dank anubhavas Kommentar für mich. Ich habe die Schrägstriche auch durch Kommas ersetzt, da der Parameter, den mein Bash-Skript annimmt, Schrägstriche enthält, da er ein Benutzerverzeichnis durchlässt. – SomeGuyOnAComputer

Antwort

32

laufen, können Sie versuchen, diese sed:

sed -i.bak 's/^\(VAR5=\).*/\1VALUE10/' file 

Es gibt:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 
+3

+1. Ich möchte nur ein anderes, ein bisschen einfacher (aber weniger wirksam, funktioniert nur, wenn wir genau den Anfang wissen): 'sed -i.bak 's/^ VAR5 =. */VAR5 = VALUE10 /' Datei ' –

+0

Das Problem Bei beiden Antworten müssen Sie den Wert von VAR5 kennen. In meinem Fall kennen Sie den Wert von VAR5 nicht, also wollen Sie "VAR5 =" finden und die Zeichenkette zwischen dieser und der neuen Zeile finden. – SomeGuyOnAComputer

+1

Der Wert von 'VAR5' war in Ihrem Beispiel' VALUE5' und diese Antwort musste nicht'VALUE5' kennen. – anubhava

3

können Sie sagen:

sed -i '/^VAR5=/s/=.*/=VALUE10/' filename 
0

Versuchen Sie Folgendes

:

sed '/^VAR5=/s/=.*/=VALUE10/' filename 

in die Datei in-place, verwenden Sie die -i Option in die Änderung vorzunehmen sed -r 's/^ (VAR5 =). */\ ERSATZ /'

Der Wert von VAR5 wird durch ERSETZEN ersetzt.

1
sed '/\(^VAR5=\).*/ s//\1VALUE10/' YourFile 

Unter AIX/KSH

$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

$ sed '/\(^VAR5=\).*/ s//\1VALUE10/' sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

und für den Austausch in der Datei

cat <> YourFile | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 

$ cat <> sample.txt | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 
$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

Um POSIX zu sein (auf sed Teil, nicht cat) kompatibel (sed --posix auf Gnu sed und nativ traditional sed on non linux system)

+1

Es gibt nichts POSIX über einen [nutzlosen Gebrauch von 'cat'] (http : //partmaps.org/era/unix/award.html). Auch dieser Diamant '<>' sieht völlig fehl am Platze aus. – tripleee

4

Sogar t obwohl die Antwort der Frage hinzugefügt wurde.Ich verbrachte einige Zeit auf, wie es funktioniert, würde Ich mag einige Fakten hinzufügen und meine Version der Antwort,

sed -i 's,^\(THISISMYVARIABLE[ ]*=\).*,\1'THISISMYVALUE',g' config.cfg 

Erläuterung:

  • Als Grund von sed 's/find_this/replace_with/', sagen wir, sed zum Suchen und Ersetzen. Denken Sie auch daran, dass es mehrere andere Trennzeichen gibt, die wir anstelle von / verwenden können. Hier wird , verwendet.
  • Hier finden wir die Zeile, die ^\(THISISMYVARIABLE[ ]*=\).* entspricht. Das heißt, wir gruppieren die Übereinstimmung THISISMYVARIABLE[ ]*=. ([ ]* abdecken, wenn nach dem Schlüssel Leerzeichen vorhanden sind)
  • In Abschnitt ersetzen \1 ist eine Rückreferenz. Wir verweisen auf die erste Gruppe im regulären Ausdruck, die wir für die Übereinstimmung verwendet haben.
+0

THISISMYVALUE ist ohne Anführungszeichen gemäß der Op. Warum Leerzeichen vorher gleich sind, scheint überkorrekt! Der Rest ist gültig, Rückverweis ist der richtige Name .. – Timo