Reemplazar solo variables específicas con envsubst

54

Estoy tratando de realizar la sustitución de variables de entorno envsubst, pero solo quiero reemplazar variables específicas.

De los documentos, debería poder decir envsubstque solo reemplace ciertas variables, pero no puedo hacerlo.

Por ejemplo, si tengo un archivo que contiene:

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

¿Cómo debo ejecutar envsubstpara que solo reemplace la referencia ${VAR_1}?

João Angelo
fuente

Respuestas:

131

Por la página del manual:

envsubst [OPTION] [SHELL-FORMAT]

Si se proporciona un SHELL-FORMAT, solo se sustituyen las variables de entorno a las que se hace referencia en SHELL-FORMAT; de lo contrario, se sustituyen todas las referencias de variables de entorno que ocurren en la entrada estándar.

Donde las cadenas SHELL-FORMAT son "cadenas con referencias a variables de shell en la forma $variableo ${variable}[...] Los nombres de las variables deben consistir únicamente en caracteres ASCII alfanuméricos o de subrayado, no comenzar con un dígito y no ser vacíos; de lo contrario, dicha referencia de variable es ignorado ". .
Por lo tanto, uno tiene que pasar los nombres de las variables respectivas envsubsten una cadena de formato de shell (obviamente, deben escaparse / citarse para que se pasen literalmente a envsubst). Ejemplo:

archivo de entrada, por ejemplo infile:

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

y algunos valores como

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

luego corriendo

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

o

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

o

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

salidas

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

O, si prefiere la barra invertida:

envsubst \$VAR1,\$VAR2 <infile

produce

VAR1=one
VAR2=two
VAR3=${VAR3}
don_crissti
fuente
14
¿Por qué no es esta la respuesta aceptada?
Qsiris
3
Sí, esta es la respuesta correcta!
Thomas Decaux
3
Si conoce un prefijo de variable para limitar las variables que se pueden sustituir:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott
O si tiene una lista de ellos SUBST_VARSentonces:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott