
Nehmen wir an, ich erhalte die folgende Ausgabe, nachdem ich ein Bash-Skript in der CLI ausgeführt habe (dieser Text wird also im Terminal angezeigt):
POST https://mycompany.com/ COOKIE='BLABLABLABLABLA' HOST='ANYIPADDRESS' FINGERPRINT='sha256:BLABLABLABLA'
Wie kann ich den Inhalt von
COOKIE
(nur den Text zwischen'
und'
) in einer separaten Datei speichern?
Des Weiteren soll der besagte Text an einer bestimmten Stelle in diese externe Datei eingefügt werden.
Der bereits vorhandene Dateiinhalt sieht folgendermaßen aus:
[global] Name = Name of VPN connection [provider_openconnect] Type = OpenConnect Name = Name of VPN connection Host = IP-address Domain = Domain name OpenConnect.Cookie = >>>INSERT CONTENT OF THE COOKIE HERE<<< OpenConnect.ServerCert = sha256:BLABLABLABLA
Wie ist das möglich?
Antwort1
Diese Art von Dingen sind nicht allgemeiner Natur, aber spezifisch, obwohl der Ansatz allgemein ist
Ich gehe davon aus, dass Sie die Zeile ersetzen möchten OpenConnect.Cookie =
durchOpenConnect.Cookie = BLABLABLABLABLA
Um also zuerst die erforderliche Zeichenfolge zu erstellen, können Sie verwenden
sed -i "s/^OpenConnect.Cookie =.*$/$( command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename
Hier verwende ich die Befehlsersetzung, um zuerst die erforderliche Zeichenfolge zu erstellen
command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"
und dann die erforderliche Zeile durch diese erforderliche Zeichenfolge ersetzen
sed -i "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
Antwort2
Du könntest benutzen:
. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file
Wo:
file
ist die vorhandene Datei mit Inhalt wie in der Frage beschrieben.command
ist Ihr Befehl, der den Text auf dem Terminal druckt.grep "^COOKIE="
sucht nach einer Zeile, die beginnt mitCOOKIE=
- und der Punkt am Anfang des Befehls "sourcet" die Ausgabe. Das bedeutet, dass die Ausgabe als Shell-Code interpretiert wird. Die Variable
$COOKIE
wird also in der aktuellen Shell gesetzt. - Der
sed
Befehl ersetzt dann die Zeile in der Zieldatei durch den Inhalt der Variablen$COOKIE
.
Antwort3
Wie wäre es mit
sed -f <(CLI command | sed -n '/COOKIE=\o047/{s//\/OpenConnect.Cookie =\/ s\/= \.*$\/= /; s/.$/\//p;}') file
[global]
Name = Name of VPN connection
[provider_openconnect]
Type = OpenConnect
Name = Name of VPN connection
Host = IP-address
Domain = Domain name
OpenConnect.Cookie = BLABLABLABLABLA
OpenConnect.ServerCert = sha256:BLABLABLABLA
Es erstellt im laufenden Betrieb eine „ sed
Skriptdatei“, indem es die relevanten Daten aus Ihrem CLI-Befehl extrahiert/bearbeitet, und führt diese Skriptdatei in einem zweiten sed
Aufruf mithilfe der „Prozesssubstitution“ aus.
Antwort4
Diese Antwort basiert auf@MSalter's Kommentar. Die verwendete Shell ist Bash.
prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file
Alternative Lösung (mit GNU expr
)
Diese Lösung funktioniert, wenn nur ein passendes Ergebnis vorliegt.
prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file