So verwenden Sie Umgebungsvariablen im SED -Befehl

So verwenden Sie Umgebungsvariablen im SED -Befehl
Eine Umgebungsvariable ist ein dynamisch benannter Wert. Umgebungsvariablen werden normalerweise unter Verwendung des unten gezeigten Befehls in ein Terminal exportiert.
exportieren $ irgendwelche Variable = Wert

Dateien sind in allen Terminals nach Quelle verfügbar. Zu diesem Zweck werden Umgebungsvariablen in Bash -Dateien gespeichert.

Angenommen, der Benutzer muss Umgebungsvariablen mit Hilfe des SED -Befehls verwenden oder ändern. In diesem Fall können Benutzer den Befehl nicht wie oben erwähnt verwenden. Für den SED -Befehl müssen verschiedene Funktionen und Methoden verwendet werden. In diesem Artikel werden wir einige solche Methoden sehen, die wie folgt sind.

In der Linux-Befehlszeile ist SED ein wirksames Verarbeitungswerkzeug. Mit kompakten SED-Einzeiler führen Benutzer häufig einen Textersatz durch, was sehr bequem ist. Wenn Benutzer SED durch Shell -Variablen ersetzen, hat es auch einige Nachteile.

So verwenden Sie Umgebungsvariablen im SED -Befehl

Lassen Sie uns ein Beispiel haben, hier haben wir eine Datei mit dem Namen Test.txt.

Katzentest.txt
Current_time = # füllen Sie die
Aktuelles Datum und Uhrzeit
Java_Home = # füllen Sie die
Java_Home Pfad

Wir werden ein Shell -Skript schreiben, um den Pfad und die aktuelle Zeit für Java_Home im obigen aktuellen System zu bevölkern. Dieser Prozess ist einfach, aber es gibt einige Probleme, die möglich sind. Hier schreiben wir ein Skript mit Gnu sed.

Wie wir oben erwähnt haben, werden wir hier den Pfad und die aktuelle Zeit Java_Home ersetzen. Dazu werden wir zuerst die aktuelle Zeit hier an den richtigen Stellen füllen. Wir können den Befehl Datum verwenden, um die aktuelle Zeit zu erhalten.

Katzenlösung.Sch
#!/bin/sh
My_date = $ (Datum)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'Test.txt

Das oben geschriebene Skript ist nicht allzu schwer zu verstehen. Wenn Sie den Befehl zuerst in einem variablen my_date ersetzen, erhalten Sie die Uhrzeit und das aktuelle Datum und speichern Sie ihn.

Nachdem der Benutzer die Daten mit SED -Substitution erhalten hat, füllt er sie in der Datei. Wir haben die Option -i -Option des Befehls gnu sed verwendet.

Jetzt werden wir unser Skript überprüfen und ausführen.

$ ./Lösung.Sch
$ CAT -Test.txt
Current_time = $ my_date
Java_home = # füllen Sie den Java_Home -Pfad

Wir sehen in der Ausgabe, dass die Linie mit "current_time =" ersetzt wurde. Das buchstäbliche „$ my_date“ wird jedoch statt der Zeit und des aktuellen Datums ausgefüllt.

Der Grund, warum Shell -Variablen nicht innerhalb einzelner Zitate erweitert werden, ist, dass wir einzelne Zitate unter dem SED -Befehl verwendet haben.

Im Befehl SED werden doppelte Anführungszeichen verwendet, um eine schnelle Expansion für die Variable der Schalen zu ermöglichen.

$ CAT -Lösung.Sch
#!/bin/sh
My_date = $ (Datum)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"Test.txt

Jetzt werden wir die Lösung testen.SH Drehbuch wieder.

$ ./Lösung.Sch
$ CAT -Test.txt
Current_time = mi 2 27. Januar 22:02:05 PM CET 2021
Java_home = # füllen Sie den Java_Home -Pfad

Nachdem die Uhrzeit und das Datum an den richtigen Stellen gefüllt sind, wird der Pfad Java_Home gefüllt.

Wir sehen, welchen Trennzeichen wir verwenden sollten, indem wir unserer Lösung einen weiteren SED -Befehl hinzufügen.sh script.

$ CAT -Lösung.Sch

sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"Test.txt
sed -i -r "s/^(java_home =).*/\ 1 $ java_home/"Test.txt

Überprüfen Sie das obige Skript.

$ ./Lösung.Sch
SED: -e Ausdruck Nr. 1, char 24: Unbekannte Option zu 's' '

Wir sehen, dass der neue SED -Befehl, der hinzugefügt wurde, nicht funktioniert. Wenn wir es zum zweiten Mal testen, sehen wir, dass nur seine Variable unterschiedlich ist, aber das Arbeiten mit dem SED -Befehl gleich ist. Um dies zu lösen, sollten wir die folgenden Maßnahmen ergreifen:

Der Trennzeichen existiert in der Variablen nicht

Um dies gut zu wissen, müssen Benutzer zunächst verstehen, was die Umgebungsvariable $ java_home enthält.

$ echo $ java_home
/usr/lib/jvm/Standard

Wir können sehen. Unser zweiter SED -Befehl erfolgt also nach einer variablen Ausdehnung.

sed -i -r "s/^(java_home =).*/\ 1/usr/lib/jvm/Standard/"Test.txt

Die Schrägstriche (/) im Wert der Variablen stören den Befehl 's' (S/Muster/Ersatz/), weshalb der obige SED -Befehl nicht funktioniert. Auf diese Weise können wir andere Zeichen als Grenzwerte des Befehls 's "auswählen.

Benutzer können den zweiten SED -Befehl leicht ändern, um dies zu lösen, indem Sie '#' als Trennzeichen des S -Befehls verwenden.

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

Jetzt testen wir das obige Skript.

$ ./Lösung.Sch
$ CAT -Test.txt
Current_time = Mi 2 27. Januar 22:36:57 PM CET 2021
Java_home =/usr/lib/jvm/Standard

Lösung 2

Lösung.SH funktioniert in den meisten Fällen. Wir sehen auch, dass '#' in Dateinamen ein gültiges Zeichen für die meisten *Nix -Dateisysteme ist. Wenn wir unser Skript in einem System auf Java_Home auf /opt /#JVM#ausführen, schlägt das Skript des Benutzers erneut fehl. Wir werden die folgende Arbeit für unser Skript erledigen, um in allen Fällen zu arbeiten

  1. Wenn der Benutzer '#' als Trennzeichen für eine bessere Lesbarkeit nimmt, muss er einen Trennzeichen für den SED -Befehl auswählen.
  2. Wir müssen allen Trennzeichen -Zeichen entkommen, die sich im Inhalt der Variablen befinden.
  3. Zuletzt sammeln Sie das verbleibende Material im SED -Befehl.

Benutzer können die Bash -Substitution verwenden, um dem Trennzeichen zu entkommen. Zum Beispiel kann der Benutzer allen '#' Zeichen in variablen $ var entkommen.

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

Jetzt werden wir unser Skript hier anwenden.

$ CAT -Lösung.Sch
#!/bin/sh
My_date = $ (Datum)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"Test.txt
sed -i -r "S#^(java_home =).*#\ 1 $ java_home //#/\\##"Test.txt

Wir werden testen, indem wir unser Skript mit der falschen Java_Home -Variablen ausführen, um festzustellen, ob es wie erwartet funktioniert.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./Lösung.Sch
$ CAT -Test.txt
Current_time = dhu 28. Januar 11:23:07 Uhr CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Wir schließen daraus, dass unser Drehbuch funktioniert, obwohl wir viele Sonderzeichen in unserer Variablen java_home haben.

Abschluss

In diesem Artikel haben wir gesehen, wie man Umgebungsvariablen mit dem SED -Befehl verwendet. Sie machen auch viele Fehler, die sie verursachen, die wir auch in diesem Artikel und in ihrer Behörde erwähnt haben. Wir hoffen, dass Sie aus diesem Artikel das vollständige Wissen erhalten, das Sie brauchen.