Come utilizzare le variabili di ambiente nel comando SED

Come utilizzare le variabili di ambiente nel comando SED
Una variabile di ambiente è un valore denominato dinamicamente. Le variabili ambientali vengono generalmente esportate in un terminale usando il comando di seguito.
Esporta $ ATTRABLE = Valore

I file sono disponibili in tutti i terminali dopo l'origine; A tale scopo, le variabili ambientali sono archiviate all'interno di file bash.

Supponiamo che l'utente debba utilizzare o modificare le variabili ambientali con l'aiuto del comando SED. In tal caso, gli utenti non possono utilizzare il comando come menzionato sopra per questo. Diverse funzioni e metodi devono essere utilizzati per il comando SED. In questo articolo, vedremo alcuni metodi di questi, che sono seguenti.

Nella linea di comando Linux, SED è un potente strumento di elaborazione. Utilizzando una linea One-Liner compatta, gli utenti spesso eseguono la sostituzione del testo, il che è abbastanza conveniente. Quando gli utenti sostituiscono SED con le variabili di shell, ha anche alcuni svantaggi.

Come utilizzare le variabili di ambiente nel comando SED

Facciamo un esempio, qui abbiamo un file denominato test.TXT.

Test del gatto.TXT
Current_time = # riempire il
Data e ora corrente
Java_home = # riempi il
Path java_home

Scriveremo uno script di shell per popolare il percorso Java_home e il tempo corrente nel sistema di corrente sopra indicato. Questo processo è facile, ma ci sono alcuni problemi che sono possibili. Qui scriveremo uno script usando GNU SED.

Come abbiamo detto sopra, qui sostituiremo il percorso Java_home e il tempo corrente. Per questo, riempiremo prima l'ora corrente nei posti giusti qui. Possiamo usare il comando data per ottenere l'ora corrente.

Soluzione di gatti.sh
#!/bin/sh
My_date = $ (data)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'test.TXT

Lo script scritto sopra non è troppo difficile da capire. Sostituendo prima il comando in una variabile MY_DATE, ottieni l'ora e la data corrente e salvalo.

Dopo aver ottenuto i dati utilizzando la sostituzione SED, l'utente li riempie nel file. Abbiamo usato l'opzione -I del comando GNU SED per eseguire l'editing sul posto.

Ora controlleremo ed eseguiremo il nostro script.

$ ./soluzione.sh
$ cat test.TXT
Current_time = $ my_date
Java_home = # riempi il percorso Java_home

Vediamo nell'output che la linea con "current_time =" è stata sostituita. Tuttavia, il letterale "$ my_date" viene compilato invece dell'ora e della data corrente.

Il motivo per cui le variabili di shell non sono ampliate all'interno di citazioni singole è che abbiamo usato singoli citazioni con il comando SED.

I marchi di doppia quotazione vengono utilizzati nel comando SED per consentire un'espansione variabile con shell a fissaggio rapido.

SOLUZIONE $ CAT.sh
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.TXT

Ora testeremo la soluzione.sceneggiatura di nuovo.

$ ./soluzione.sh
$ cat test.TXT
Current_time = mer 27 gennaio 10:02:05 CET 2021
Java_home = # riempi il percorso Java_home

Dopo aver riempito l'ora e la data nei posti giusti, il percorso Java_Home viene riempito.

Vediamo quale delimitatore dovremmo usare aggiungendo un altro comando SED alla nostra soluzione.Script SH.

SOLUZIONE $ CAT.sh
..
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.TXT
sed -i -r "s/^(java_home =).*/\ 1 $ java_home/"test.TXT

Controllare lo script sopra.

$ ./soluzione.sh
SED: -e Expression #1, Char 24: Opzione sconosciuta a 'S'

Vediamo che il nuovo comando SED che è stato aggiunto non funziona. Se lo testiamo per la seconda volta, vediamo che solo la sua variabile è diversa, ma lavorare è la stessa del comando SED. Per risolvere questo problema, dovremmo prendere le seguenti misure:

Il delimitatore non esiste nella variabile

Per saperlo bene, gli utenti devono prima capire cosa contiene la variabile di ambiente $ java_home.

$ echo $ java_home
/usr/lib/jvm/default

Possiamo vedere che quelle variabili di shell sono ampliate in doppia quota. Quindi il nostro secondo comando SED arriva dopo l'espansione variabile.

sed -i -r "s/^(java_home =).*/\ 1/usr/lib/jvm/default/"test.TXT

Le barre (/) nel valore della variabile interferiscono con il comando 's' (s/pattern/sostituzione/), motivo per cui il comando SED sopra non funziona. In questo modo, possiamo selezionare altri caratteri come delimitatori del comando "S".

Gli utenti possono modificare leggermente il secondo comando SED per risolvere questo problema utilizzando "#" come delimitatore del comando S.

sed -i -r "s#^(java_home =).*#\ 1 $ java_home#"test.TXT

Ora testiamo lo script sopra.

$ ./soluzione.sh
$ cat test.TXT
Current_time = mer 27 gennaio 10:36:57 CET 2021
Java_home =/usr/lib/jvm/default

Soluzione 2

soluzione.SH funziona nella maggior parte dei casi. Inoltre, vediamo che "#" nei fileNames è un carattere valido sulla maggior parte dei file system *Nix. Se eseguiamo il nostro script su java_home su un sistema impostato su /opt /#jvm#, lo script dell'utente fallisce di nuovo. Faremo il seguente lavoro affinché il nostro script funzioni in tutti i casi

  1. Se l'utente prende "#" come delimitatore per una migliore leggibilità, deve selezionare un delimitatore per il comando SED.
  2. Dobbiamo sfuggire a tutti i caratteri delimitanti che sono nel contenuto della variabile.
  3. Infine, raccogli il materiale rimanente nel comando SED.

Gli utenti possono usare la sostituzione bash per sfuggire al delimitatore. Ad esempio, l'utente può sfuggire a tutti i caratteri '#' in variabile $ var.

$ Var = "foo#bar#blah"
$ echo "$ var //#/\\#"
Foo \ #Bar \ #blah

Ora applicheremo il nostro script qui.

SOLUZIONE $ CAT.sh
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.TXT
sed -i -r "s#^(java_home =).*#\ 1 $ java_home //#/\\##"Test.TXT

Testeremo eseguendo il nostro script con la variabile spuria Java_home per vedere se funziona come previsto.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./soluzione.sh
$ cat test.TXT
Current_time = Thu 28 gennaio 11:23:07 CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Concludiamo che la nostra sceneggiatura funziona anche se abbiamo molti personaggi speciali nella nostra variabile Java_home.

Conclusione

In questo articolo, abbiamo visto come utilizzare le variabili ambientali con il comando SED. Fanno anche molti errori che causano, che abbiamo anche menzionato in questo articolo e il loro riparazione. Speriamo che da questo articolo otterrai la conoscenza completa di cui hai bisogno.