
Vamos supor que recebo a seguinte saída após executar um script bash na CLI (para que este texto seja exibido no terminal):
POST https://mycompany.com/ COOKIE='BLABLABLABLABLA' HOST='ANYIPADDRESS' FINGERPRINT='sha256:BLABLABLABLA'
Como posso armazenar o conteúdo de
COOKIE
(apenas o texto entre'
e'
) em um arquivo separado?
Além disso, o texto mencionado deverá ser colado neste arquivo externo em uma posição específica.
O conteúdo do arquivo já existente é assim:
[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
Como isso é possível?
Responder1
Esses tipos de coisas não são de natureza genérica, mas específicos, embora a abordagem seja genérica
Estou assumindo que você deseja substituir OpenConnect.Cookie =
line porOpenConnect.Cookie = BLABLABLABLABLA
Então, para primeiro criar a string necessária, você pode usar
sed -i "s/^OpenConnect.Cookie =.*$/$( command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename
Aqui estou usando a substituição de comando para criar primeiro a string necessária
command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"
e então substituindo a linha necessária por esta string necessária
sed -i "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
Responder2
Você poderia usar:
. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file
Onde:
file
é o arquivo existente com o conteúdo descrito na pergunta.command
é o seu comando que imprime o texto no terminal.grep "^COOKIE="
procura uma linha começando comCOOKIE=
- e o ponto no início do comando "fonte" a saída. Isso significa que a saída é interpretada como código shell. Assim, a variável
$COOKIE
é definida no shell atual. - O
sed
comando então substitui a linha no arquivo de destino pelo conteúdo da variável$COOKIE
.
Responder3
Que tal
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
Ele cria um " sed
arquivo de script" dinamicamente, extraindo/massageando os dados relevantes do seu comando CLI e executa esse arquivo de script usando "substituição de processo" em uma segunda sed
chamada.
Responder4
Esta resposta é baseada em@MSalterscomentário de. O shell usado é o Bash.
prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file
Solução alternativa (usando GNU expr
)
Esta solução funciona se houver apenas um resultado correspondente.
prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file