Hvordan bruke miljøvariabler i SED -kommandoen

Hvordan bruke miljøvariabler i SED -kommandoen
En miljøvariabel er en dynamisk navngitt verdi. Miljøvariabler eksporteres vanligvis til en terminal ved å bruke kommandoen vist nedenfor.
Eksporter $ somevariable = verdi

Filer er tilgjengelige i alle terminaler etter kilde; For dette formålet lagres miljøvariabler i bash -filer.

Anta at brukeren må bruke eller endre miljøvariabler ved hjelp av SED -kommandoen. I så fall kan ikke brukere bruke kommandoen som nevnt ovenfor for dette. Ulike funksjoner og metoder må brukes til SED -kommandoen. I denne artikkelen vil vi se noen slike metoder, som er som følger.

I Linux-kommandolinjen er SED et potent prosesseringsverktøy. Ved hjelp av kompakte sed one-liners gjør brukere ofte tekstutskiftning som er ganske praktisk. Når brukere erstatter SED med skallvariabler, har den også noen ulemper.

Hvordan bruke miljøvariabler i SED -kommandoen

La oss ha et eksempel, her har vi en fil som heter Test.tekst.

kattest.tekst
Current_time = # Fyll
Gjeldende dato og tid
Java_home = # fyll
Java_Home Path

Vi vil skrive et skallskript for å befolke Java_Home -banen og nåværende tid i ovennevnte gjeldende system. Denne prosessen er enkel, men det er noen problemer i den som er mulig. Her skal vi skrive et manus ved hjelp av Gnu Sed.

Som vi har nevnt ovenfor, her vil vi erstatte Java_Home -banen og nåværende tid. For dette vil vi først fylle den nåværende tiden på de rette stedene her. Vi kan bruke datakommandoen for å få gjeldende tid.

katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'test.tekst

Manuset skrevet over er ikke så vanskelig å forstå. Ved først å erstatte kommandoen i en variabel my_date, få tid og nåværende dato og lagre den.

Etter å ha fått dataene ved hjelp av SED -substitusjon, fyller brukeren dem i filen. Vi har brukt -i -alternativet til GNU SED -kommandoen for å utføre redigering på stedet.

Nå skal vi sjekke og utføre skriptet vårt.

$ ./løsning.sh
$ kattest.tekst
Current_time = $ my_date
Java_home = # Fyll Java_Home -banen

Vi ser i utgangen at linjen med “Current_time =” er erstattet. Imidlertid er den bokstavelige "$ my_date" fylt ut i stedet for tid og nåværende dato.

Årsaken til at skallvariabler ikke utvides innenfor enkelt sitater, er at vi brukte enkelt sitater under SED -kommandoen.

Dobbelt anførselstegn brukes i SED -kommandoen for å tillate hurtigfikseskallvariabel utvidelse.

$ katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst

Nå vil vi teste løsningen.SH -manus igjen.

$ ./løsning.sh
$ kattest.tekst
Current_time = ons 27. januar 10:02:05 PM CET 2021
Java_home = # Fyll Java_Home -banen

Etter å ha fylt tid og dato på de rette stedene, er Java_Home -banen fylt.

Vi ser hvilken avgrenser vi bør bruke ved å legge til en annen SED -kommando til løsningen vår.SH -manus.

$ katteløsning.sh
..
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst
sed -i -r "s/^(java_home =).*/\ 1 $ Java_Home/"Test.tekst

Sjekker skriptet ovenfor.

$ ./løsning.sh
SED: -E EXPORT #1, CHAR 24: Ukjent alternativ til 'S'

Vi ser at den nye SED -kommandoen som er lagt til, fungerer ikke. Hvis vi tester det for andre gang, ser vi at bare variabelen er annerledes, men å jobbe er den samme som SED -kommandoen. For å løse dette, bør vi ta følgende tiltak:

Avgrenseren eksisterer ikke i variabelen

For å vite dette godt, må brukere først forstå hva miljøvariabelen $ Java_Home inneholder.

$ ekko $ java_home
/usr/lib/jvm/standard

Vi kan se at de skallvariablene utvides innenfor dobbeltkjøres. Så vår andre SED -kommando kommer etter variabel utvidelse.

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

Slashene (/) i variabelenes verdi forstyrrer 'S' -kommandoen (S/mønster/erstatning/), og det er grunnen til at ovennevnte SED -kommando ikke fungerer. På denne måten kan vi velge andre tegn som avgrensere av 'S' -kommandoen.

Brukere kan endre den andre SED -kommandoen for å løse dette ved å bruke '#' som avgrenseren av S -kommandoen.

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

Nå tester vi skriptet ovenfor.

$ ./løsning.sh
$ kattest.tekst
Current_time = ons 27. januar 10:36:57 PM CET 2021
Java_home =/usr/lib/jvm/standard

Løsning 2

løsning.SH fungerer i de fleste tilfeller. Vi ser også at '#' i filnavn er et gyldig tegn på de fleste *nix filsystemer. Hvis vi utfører skriptet vårt til java_home på et system satt til /opt /#jvm#, mislykkes brukerens skript igjen. Vi vil gjøre følgende arbeid for at skriptet vårt skal fungere i alle tilfeller

  1. Hvis brukeren tar '#' som avgrenser for bedre lesbarhet, må de velge en avgrenser for SED -kommandoen.
  2. Vi må slippe unna alle avgrensningskarakterene som er i innholdet i variabelen.
  3. Til slutt, samle det gjenværende materialet i SED -kommandoen.

Brukere kan bruke bash -substitusjon for å unnslippe avgrenseren. For eksempel kan brukeren slippe unna alle '#' tegn i variabel $ var.

$ Var = "foo#bar#bla"
$ ekko "$ var //#/\\#"
foo \ #bar \ #blah

Nå vil vi bruke skriptet vårt her.

$ katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst
sed -i -r "s#^(java_home =).*#\ 1 $ java_home //#/\\##"Test.tekst

Vi vil teste ved å utføre skriptet vårt med den falske Java_Home -variabelen for å se om det fungerer som forventet.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./løsning.sh
$ kattest.tekst
Current_time = Thu 28. januar 11:23:07 AM CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Vi konkluderer med at skriptet vårt fungerer selv om vi har mange spesialtegn i vår java_home -variabel.

Konklusjon

I denne artikkelen så vi hvordan vi bruker miljøvariabler med SED -kommandoen. De gjør også mange feil som de forårsaker, som vi også har nevnt i denne artikkelen og deres oppreisning. Vi håper at du fra denne artikkelen får den fullstendige kunnskapen du trenger.