Прямой -прямой awk
сценарий:
awk '
/^client/ { ipaddr = $2 }
/^[[:blank:]]*shortname/{ shortname = $3 }
/^[[:blank:]]*secret/ { secret = $0; sub("^[^=]*= ", "", secret) }
/^}/ {
printf("client %s { secret = %s, ipaddr = %s }\n",
shortname, secret, ipaddr);
}' file
Просто проанализируйте необходимые биты информации, когда мы найдем их во входном файле, и когда мы нажмем }
в начале строки, мы выведем собранную информацию в правильном формате.
Анализ текста secret
особенный, поскольку мы ожидаем, что он будет содержать что угодно , даже разделители полей. Он просто начинается с установки переменной secret
на всю строку, а затем удаляет все до первой =
и один пробел после нее.
Учитывая файл
client 192.168.100.2 {
secret = ThisIStheSECRET2
shortname = HOSTNAME2
}
client 10.0.0.1 {
secret = This is it, the secret!, ipaddr = 10.0.0.1
shortname = myhost.local
}
(обратите внимание на четыре пробела в начале секрета ), это дает
client HOSTNAME2 { secret = ThisIStheSECRET2, ipaddr = 192.168.100.2 }
client myhost.local { secret = This is it, the secret!, ipaddr = 10.0.0.1, ipaddr = 10.0.0.1 }
Переменная может не содержать произвольные двоичные значения (в большинстве оболочек ).
Создав значение P
следующим образом:
P=$( echo 'mysuperpassword3' |
openssl enc -aes-256-cbc -pbkdf2 -pass pass:'secret')
вы подвергаетесь воздействию NUL-байтов, новых строк, $var
расширениям и многим другим проблемам. Одним из возможных решений является сохранение значения в кодировке base64 :
P=$( echo 'mysuperpassword3' |
openssl enc -aes-256-cbc -pbkdf2 -base64 -pass pass:'secret')
Это позволит избежать многих проблем, но, тем не менее, :расширения переменных следует заключать в кавычки:
sed -i 's/PASSWORD=.*/PASSWORD='"${P}"'/' "${PFILE}"