GNU/Linux >> Linux Esercitazione >  >> Linux

Come sostituire le variabili di shell in file di testo complessi

So che questo argomento è vecchio, ma ho una soluzione di lavoro più semplice senza esportare le variabili. Può essere un oneliner, ma preferisco dividere usando \ a fine riga.

var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"

#         ^^^^^^^^^^^    ^^^^^^^^^^     ^^^^^^^^^^^^^^^
# define which to replace   input            output

Le variabili devono essere definite sulla stessa riga di envsubst è da considerare come variabili d'ambiente.

Il '$var1,$var3' è facoltativo per sostituire solo quelli specificati. Immagina un file di input contenente ${VARIABLE_USED_BY_JENKINS} che non dovrebbe essere sostituito.


In riferimento alla risposta 2, discutendo di envsubst, hai chiesto:

Come posso farlo funzionare con le variabili dichiarate nel mio script .sh?

La risposta è che devi semplicemente esportare le tue variabili prima di chiamare envsubst .

Puoi anche limitare le stringhe di variabili che vuoi sostituire nell'input usando envsubst SHELL_FORMAT argomento (evitando la sostituzione involontaria di una stringa nell'input con un valore di variabile di shell comune, ad esempio $HOME ).

Ad esempio:

export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'

envsubst "$MYVARS" <source.txt >destination.txt

Sostituirà tutte le istanze di $VAR1 e $VAR2 (e solo VAR1 e VAR2 ) in source.txt con 'somevalue' e 'someothervalue' rispettivamente.


Guardando, risulta che sul mio sistema c'è un envsubst comando che fa parte del pacchetto gettext-base.

Quindi, questo lo rende facile:

envsubst < "source.txt" > "destination.txt"

Nota se vuoi usare lo stesso file per entrambi, dovrai usare qualcosa come sponge di moreutil , come suggerito da Johnny Utahh:envsubst < "source.txt" | sponge "source.txt" . (Perché altrimenti il ​​reindirizzamento della shell svuoterà il file prima della sua lettura.)


Linux
  1. Come utilizzare il comando Grep per trovare testo nei file

  2. Come comprimere e decomprimere file in Linux

  3. Come unire due file di testo in Linux

  4. Come impostare/creare variabili di ambiente e shell in Linux

  5. Come modificare l'estensione di più file?

Come utilizzare le variabili negli script della shell

Come confrontare e unire file di testo su Linux

Come confrontare e unire file di testo su Linux (parte 2)

Come utilizzare il comando cp per copiare file e directory

Come reindirizzare l'output del comando della shell

Scripting Bash:come scrivere dati su file di testo