Jak używać zmiennych środowiskowych w poleceniu SED

Jak używać zmiennych środowiskowych w poleceniu SED
Zmienna środowiskowa to dynamicznie nazwana wartość. Zmienne środowiskowe są zwykle eksportowane do terminala za pomocą polecenia pokazanego poniżej.
Eksportuj $ SomeVariable = wartość

Pliki są dostępne we wszystkich terminach po źródle; W tym celu zmienne środowiskowe są przechowywane w plikach BASH.

Załóżmy, że użytkownik musi używać lub zmienić zmienne środowiskowe za pomocą polecenia SED. W takim przypadku użytkownicy nie mogą używać polecenia, jak wspomniano powyżej. Do polecenia SED muszą być używane różne funkcje i metody. W tym artykule zobaczymy kilka takich metod, które są następujące.

W linii poleceń Linux SED jest silnym narzędziem przetwarzania. Korzystając z kompaktowych jedno-liniowców SED, użytkownicy często wykonują wymianę tekstu, co jest dość wygodne. Kiedy użytkownicy zastępują SED zmiennymi powłoki, ma również pewne wady.

Jak używać zmiennych środowiskowych w poleceniu SED

Zróbmy przykład, tutaj mamy plik o nazwie Test.tekst.

Test CAT.tekst
Current_time = # wypełnij
Obecna data i godzina
Java_home = # wypełnij
Ścieżka java_home

Napiszemy skrypt powłoki, aby zapełnić ścieżkę java_home i bieżący czas w powyższym bieżącym systemie. Ten proces jest łatwy, ale są w nim pewne problemy, które są możliwe. Tutaj napiszemy skrypt za pomocą gnU sed.

Jak wspomnieliśmy powyżej, tutaj zastąpimy ścieżkę java_home i aktualny czas. W tym celu najpierw wypełnimy obecny czas we właściwych miejscach tutaj. Możemy użyć polecenia daty, aby uzyskać bieżący czas.

Rozwiązanie CAT.cii
#!/bin/sh
My_date = $ (data)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'test.tekst

Skrypt napisany powyżej nie jest zbyt trudny do zrozumienia. Najpierw zastępując polecenie w zmiennej MY_DATE, uzyskaj czas i bieżącą datę i zapisz ją.

Po uzyskaniu danych za pomocą podstawienia SED użytkownik wypełnia je w pliku. Użyliśmy opcji -i polecenia GNU SED do wykonywania edycji na miejscu.

Teraz sprawdzimy i wykonamy nasz skrypt.

$ ./rozwiązanie.cii
Test $ CAT.tekst
Current_time = $ my_date
Java_home = # wypełnij ścieżkę java_home

W wyjściu widzimy, że linia z „current_time =” została wymieniona. Jednak dosłowny „$ my_date” jest wypełniony zamiast czasu i aktualnej daty.

Powodem, dla którego zmienne powłoki nie są rozszerzone w pojedynczych cytatach, jest to, że użyliśmy pojedynczych cytatów pod poleceniem SED.

Podwójne znaki cytatowe są używane w poleceniu SED, aby umożliwić rozszerzenie zmiennej powłoki szybkiej poprawki.

Rozwiązanie $ cat.cii
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/”test.tekst

Teraz przetestujemy rozwiązanie.Skrypt SH ponownie.

$ ./rozwiązanie.cii
Test $ CAT.tekst
Current_time = śr. 27 stycznia 10:02:05 CET 2021
Java_home = # wypełnij ścieżkę java_home

Po wypełnieniu godziny i daty we właściwych miejscach ścieżka Java_Home jest wypełniona.

Widzimy, którego ogranicznika powinniśmy użyć, dodając inne polecenie SED do naszego rozwiązania.Skrypt SH.

Rozwiązanie $ cat.cii

sed -i -r "s/^(current_time =).*/\ 1 $ my_date/”test.tekst
sed -i -r "s/^(java_home =).*/\ 1 $ java_home/”.tekst

Sprawdzanie powyższego skryptu.

$ ./rozwiązanie.cii
sed: -e wyrażenie nr 1, char 24: nieznana opcja „s”

Widzimy, że nowe polecenie SED, które zostało dodane. Jeśli przetestujemy go po raz drugi, widzimy, że tylko jej zmienna jest inna, ale działa taka sama jak polecenie SED. Aby to rozwiązać, powinniśmy podjąć następujące środki:

Ogranicznik nie istnieje w zmiennej

Aby to dobrze wiedzieć, użytkownicy muszą najpierw zrozumieć, co zawiera zmienna środowiskowa $ java_home.

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

Widzimy, że zmienne powłoki są rozszerzone w obrębie podwójnych kwot. Więc nasze drugie polecenie SED pojawia się po rozszerzeniu zmiennej.

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

Slashs (/) w wartości zmiennej zakłócają polecenie „s” (s/wzór/wymiana/), dlatego powyższe polecenie SED nie działa. W ten sposób możemy wybrać inne znaki jako ograniczenia polecenia „s”.

Użytkownicy mogą nieznacznie zmodyfikować drugie polecenie SED, aby to rozwiązać za pomocą „#” jako ogranicznika polecenia S.

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

Teraz testujemy powyższy skrypt.

$ ./rozwiązanie.cii
Test $ CAT.tekst
Current_time = śr. 27 stycznia 10:36:57 CET 2021
Java_home =/usr/lib/jvm/default

Rozwiązanie 2

rozwiązanie.SH działa w większości przypadków. Widzimy również, że „#” w nazwach plików jest prawidłowym znakiem w większości systemów plików *Nix. Jeśli wykonamy nasz skrypt do java_home w systemie ustawionym na /opt /#jvm#, skrypt użytkownika ponownie się nie udaje. Wykonamy następujące prace, aby nasz skrypt działał we wszystkich przypadkach

  1. Jeśli użytkownik przyjmuje „#” jako ogranicznik dla lepszej czytelności, musi wybrać ogranicznik dla polecenia SED.
  2. Musimy uciec od wszystkich znaków, które znajdują się w zawartości zmiennej.
  3. Na koniec zbierz pozostały materiał w poleceniu SED.

Użytkownicy mogą użyć podstawienia BASH, aby uciec od ogranicznika. Na przykład użytkownik może uniknąć wszystkich znaków „#” w zmiennej $ var.

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

Teraz zastosujemy nasz skrypt tutaj.

Rozwiązanie $ cat.cii
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/”test.tekst
sed -i -r "s#^(java_home =).*#\ 1 $ Java_Home //#/\\##".tekst

Przetestujemy, wykonując nasz skrypt za pomocą fałszywej zmiennej Java_Home, aby sprawdzić, czy działa to zgodnie z oczekiwaniami.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./rozwiązanie.cii
Test $ CAT.tekst
Current_time = czw 28 stycznia 11:23:07 CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Dochodzimy do wniosku, że nasz skrypt działa, mimo że mamy wiele znaków specjalnych w naszej zmiennej Java_Home.

Wniosek

W tym artykule widzieliśmy, jak używać zmiennych środowiskowych z poleceniem SED. Popełniają także wiele błędów, które powodują, o których wspomnieliśmy również w tym artykule i ich zadośćuczynieniu. Mamy nadzieję, że z tego artykułu otrzymasz pełną wiedzę, której potrzebujesz.