
Supongamos que recibo el siguiente resultado después de ejecutar un script bash en CLI (por lo que este texto se mostrará en la terminal):
POST https://mycompany.com/ COOKIE='BLABLABLABLABLA' HOST='ANYIPADDRESS' FINGERPRINT='sha256:BLABLABLABLA'
¿Cómo puedo almacenar el contenido de
COOKIE
(solo el texto entre'
y'
) en un archivo separado?
Además, el texto mencionado debe pegarse en este archivo externo en una posición específica.
El contenido del archivo ya existente se ve así:
[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
¿Cómo es eso posible?
Respuesta1
Este tipo de cosas no son de naturaleza genérica, sino específicas, aunque el enfoque es genérico.
Supongo que quieres reemplazar OpenConnect.Cookie =
la línea conOpenConnect.Cookie = BLABLABLABLABLA
Entonces, para crear primero la cadena requerida, puedes usar
sed -i "s/^OpenConnect.Cookie =.*$/$( command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename
Aquí estoy usando la sustitución de comandos para crear primero la cadena requerida
command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"
y luego sustituyendo la línea requerida por esta cadena requerida
sed -i "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
Respuesta2
Podrías usar:
. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file
Dónde:
file
es el archivo existente con el contenido descrito en la pregunta.command
es su comando que imprime el texto en la terminal.grep "^COOKIE="
busca una línea que comience conCOOKIE=
- y el punto al principio del comando "genera" la salida. Esto significa que la salida se interpreta como código de shell. Por lo tanto, la variable
$COOKIE
se establece en el shell actual. - Luego, el
sed
comando reemplaza la línea en el archivo de destino con el contenido de la variable$COOKIE
.
Respuesta3
Qué tal si
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
Crea un " sed
archivo de secuencia de comandos" sobre la marcha extrayendo/masajeando los datos relevantes de su comando CLI y ejecuta este archivo de secuencia de comandos utilizando "sustitución de procesos" en una segunda sed
llamada.
Respuesta4
Esta respuesta se basa en@MSaltersEl comentario de. El shell utilizado es Bash.
prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file
Solución alternativa (usando GNU expr
)
Esta solución funciona si solo hay un resultado coincidente.
prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file