Ersetzen Sie nur bestimmte Variablen durch envsubst

53

Ich versuche, das Ersetzen von Umgebungsvariablen durchzuführen envsubst, möchte jedoch nur bestimmte Variablen ersetzen.

Aus den Dokumenten sollte ich in der Lage sein, envsubstnur bestimmte Variablen zu ersetzen, aber ich bin nicht in der Lage, das zu tun.

Wenn ich zum Beispiel eine Datei habe, die Folgendes enthält:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

wie soll ich das ausführen envsubstdamit es nur den verweis auf ersetzt ${VAR_1}?

João Angelo
quelle

Antworten:

4

Bevor envsubstSie anrufen , sollten Sie den Export mit einfachen Anführungszeichen verwenden, um die VAR_1Änderungen rückgängig zu machen . Wie in:

export VAR_1='somevalue'

Weitere Einzelheiten finden Sie unter:

So ersetzen Sie Shell-Variablen in komplexen Textdateien

Rui F Ribeiro
quelle
16
Die richtige Antwort ist unten
Craig
130

Per Manpage:

envsubst [OPTION] [SHELL-FORMAT]

Wenn ein SHELL-FORMAT angegeben ist, werden nur die Umgebungsvariablen ersetzt, auf die in SHELL-FORMAT verwiesen wird. Andernfalls werden alle in der Standardeingabe vorkommenden Umgebungsvariablenverweise ersetzt.

Wobei SHELL-FORMAT-Zeichenfolgen "Zeichenfolgen mit Verweisen auf Shell-Variablen in der Form $variableoder ${variable}[...] Die Variablennamen dürfen nur aus alphanumerischen Zeichen oder ASCII-Zeichen mit Unterstrich bestehen, nicht mit einer Ziffer beginnen und nicht leer sein; ignoriert. " .
Man muss also die jeweiligen Variablennamen envsubstin einer Shell-Format-Zeichenfolge übergeben (offensichtlich müssen sie mit Escape-Zeichen versehen sein, um wörtlich an übergeben zu werden envsubst). Beispiel:

Eingabedatei zB infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

und einige Werte wie

export  VAR1="one" VAR2="two" VAR3="three"

dann rennen

envsubst '${VAR1} ${VAR3}' <infile

oder

envsubst '${VAR1},${VAR3}' <infile

oder

envsubst '${VAR1}
${VAR3}' <infile

Ausgänge

VAR1=one
VAR2=${VAR2}
VAR3=three

Oder, wenn Sie Backslash bevorzugen:

envsubst \$VAR1,\$VAR2 <infile

produziert

VAR1=one
VAR2=two
VAR3=${VAR3}
don_crissti
quelle
13
Warum ist das nicht die akzeptierte Antwort?
Qsiris
3
Ja das ist die richtige Antwort!
Thomas Decaux
3
Wenn Sie ein Variablenpräfix kennen, mit dem Sie die zu ersetzenden Variablen einschränken können:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott,
Oder wenn Sie eine Liste von ihnen SUBST_VARSdann haben:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott