
Предположим, я получаю следующий вывод после выполнения скрипта bash в CLI (этот текст будет отображаться в терминале):
POST https://mycompany.com/ COOKIE='BLABLABLABLABLA' HOST='ANYIPADDRESS' FINGERPRINT='sha256:BLABLABLABLA'
Как сохранить содержимое
COOKIE
(только текст между'
и'
) в отдельный файл?
Кроме того, указанный текст необходимо вставить в этот внешний файл в определенное место.
Содержимое уже существующего файла выглядит так:
[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
Как это возможно?
решение1
Эти типы вещей не являются общими по своей природе, а специфичными, хотя подход является общим.
Я предполагаю, что вы хотите заменить OpenConnect.Cookie =
строку наOpenConnect.Cookie = BLABLABLABLABLA
Итак, чтобы сначала создать требуемую строку, вы можете использовать
sed -i "s/^OpenConnect.Cookie =.*$/$( command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename
Здесь я использую подстановку команд, чтобы сначала создать требуемую строку
command_giving_output | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"
и затем заменяем требуемую строку на эту требуемую строку
sed -i "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
решение2
Вы можете использовать:
. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file
Где:
file
существующий файл с содержимым, описанным в вопросе.command
это ваша команда, которая выводит текст на терминал.grep "^COOKIE="
ищет строку, начинающуюся сCOOKIE=
- и точка в начале команды "sources" вывод. Это означает, что вывод интерпретируется как шелл-код. Таким образом, переменная
$COOKIE
устанавливается в текущей оболочке. - Затем команда
sed
заменяет строку в целевом файле содержимым переменной$COOKIE
.
решение3
Как насчет
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
Он создает « sed
файл сценария» на лету, извлекая/обрабатывая соответствующие данные из вашей команды CLI, и выполняет этот файл сценария, используя «подстановку процесса» во втором sed
вызове.
решение4
Этот ответ основан на@MSaltersКомментарий. Используемая оболочка — Bash.
prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file
Альтернативное решение (с использованием GNU expr
)
Это решение работает, если есть только один совпадающий результат.
prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file