Предположим, я получил следующий вывод после выполнения 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
Как это возможно?
Эти типы вещей не являются общими по своей природе, но специфичны, хотя подход является общим
Я предполагаю, что вы хотите заменить строку 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
Вы можете прочитать cookie, используя комбинацию read и grep
:
IFS="'" read -r _ cookie _ < <(some-command | grep '^COOKIE')
Это использует подстановку процесса для подачи вывода команды some-command | grep '^COOKIE')
some-command | grep '^COOKIE')
read
. При IFS="='"
мы разделяем ввод на '
, отбрасывая первый элемент разбиения ( COOKIE=
) (и любой оставшийся текст после закрывающей кавычки), сохраняя второй в переменной cookie
.
Затем мы можем использовать sed
для замены текста:
sed -i 's/>>>INSERT CONTENT OF THE COOKIE HERE<<'"$cookie"'/' some-file
Это зависит от того, что текст cookie не содержит специальных символов, таких как &
, хотя.
Вы можете использовать:
. <(command | grep "^COOKIE=") sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file
Куда:
file
- это существующий файл с содержимым, как описано в вопросе. command
- это ваша команда, которая печатает текст в терминал. grep "^COOKIE="
ищет строку, начинающуюся с COOKIE=
$COOKIE
установлена в текущей оболочке. sed
заменяет строку в целевом файле содержимым переменной $COOKIE
. Как насчет
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
.
Этот ответ основан на комментарии @MSalters . Используется shell 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