GNU/Linux >> Belajar Linux >  >> Linux

Ganti variabel lingkungan dalam teks jika ada

Anda dapat menggunakan env untuk melihat semua variabel lingkungan yang ditentukan saat ini dan kemudian gunakan daftar itu untuk hanya menggantinya. (Halaman manual tidak terlalu jelas tentang itu, tetapi lihat jawaban ini untuk penjelasan.)

echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"

(Keluaran dari env mencantumkan nilai variabel juga, tetapi envsubst juga ingin melihat $ terkemuka , jadi kita tidak bisa hanya menggunakan cut -d= -f1 sendiri, sayangnya. Anda dapat menggunakan satu sed untuk melakukan cut tugasnya juga, lihat revisi sebelumnya, tapi saya lebih suka kejelasan cut dengan sedikit peningkatan performa.)


Jika Anda memberikan argumen seperti $USER$PATH ke envsubst , maka hanya memperluas variabel yang dirujuk dalam argumen itu.

Jadi salah satu caranya adalah dengan meneruskan semua variabel lingkungan yang saat ini ditentukan dalam format itu. Dengan zsh :

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst \$${(kj:$:)parameters[(R)*export*]}
  • $parameters adalah larik asosiatif khusus yang memetakan nama variabel ke tipenya
  • $parameters[(R)*export*] memperluas ke semua elemen array asosiatif yang nilainya berisi export .
  • dengan k tanda perluasan parameter, kunci bukannya nilai yang dikembalikan
  • j:$: menggabungkan elemen tersebut dengan $ di antaranya, dan kami menambahkan satu di awal.

Dengan shell lain, Anda selalu dapat kembali ke perl untuk mendapatkan daftar itu:

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"

Berhati-hatilah saat mengungkapkan nama variabel lingkungan Anda dalam keluaran ps .

Sebagai gantinya, Anda juga dapat melakukan semuanya di perl :

perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'

Berhati-hatilah karena memiliki batasan yang sama sebagai envsubst karena itu tidak akan memperluas hal-hal seperti ${VAR:-x} dan akan memperluas $HOME dalam hal-hal seperti \$HOME atau $$HOME yang tidak akan dilakukan oleh shell.


Linux
  1. Memeriksa variabel lingkungan

  2. Variabel lingkungan dalam tautan simbolik

  3. Cara mengganti variabel shell dalam file teks kompleks

  1. Tetapkan lingkungan sementara ($PATH)

  2. Betapa tidak disetelnya banyak variabel lingkungan

  3. Mengatur variabel lingkungan Linux

  1. Ganti Variabel Lingkungan Dalam File Dengan Nilai Sebenarnya?

  2. Linux – Apakah Variabel Lingkungan Terlihat oleh Pengguna yang Tidak Memiliki Hak Di Linux?

  3. Cara membaca variabel lingkungan dari suatu proses