sed с разрывом строки

Прямой -прямой 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 }
0
24.06.2019, 19:18
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}"
0
28.01.2020, 03:32

Теги

Похожие вопросы