Я хочу динамически создать шаблон файла конфигурации, содержащий учетные данные. Копия должна сохранять структуру, но со значениями, замененными пустыми строками (то есть ""). Я использую awk
для этой цели.
awk -v dq="\"" '{ if($NF ~ /^[&|\*|\n]/ || $1 == $NF) print $0; else {$NF=""; print $0 dq dq;} }' .config.yaml >> .config_temp.yaml
Проблема в выражении else. Когда я установил $NF=""
, первые пробелы больше не печатались. Если я не устанавливаю в последнем поле пустую строку, я не наблюдаю такого поведения, но, очевидно, не получаю ожидаемый результат (см. Ниже).
Как я могу установить последнее поле как пустую строку, пока сохраняя первые пробелы?
Я не хочу вручную добавлять количество пробелов, так как намерение варьируется.
config.yaml (вход)
DEVELOPMENT: &development
<<: *common
check_access_token: False
database:
mongodb:
database: test
hostname: localhost
port: 27017
username: ""
password: ""
collection:
col_1: test_1
col_2: test_2
col_3: test_3
col_4: test_4
conf_temp.yaml (фактический вывод)
DEVELOPMENT: &development
<<: *common
check_access_token: ""
database:
mongodb:
database: ""
hostname: ""
port: ""
username: ""
password: ""
collection:
property: ""
ctrl_voc: ""
form: ""
user: ""
Ожидаемый вывод
DEVELOPMENT: &development
<<: *common
check_access_token: ""
database:
mongodb:
database: ""
hostname: ""
port: ""
username: ""
password: ""
collection:
property: ""
ctrl_voc: ""
form: ""
user: ""
Редактировать (после Sundeep's повтор)
Спасибо за ваш ответ. Это почти работает, как я ожидаю. Однако я не получаю такой же вывод, как вы. Если я звоню
awk -F'[ ]' -v dq="\"" 'NF>1 && $NF !~ /^[*&]|:$/{$NF = dq dq} 1' .conf.yaml
, я получаю следующий вывод:
DEVELOPMENT: &development
<<: *common
check_access_token: ""
"" <--
"" <--
database: ""
hostname: ""
port: ""
username: ""
password: ""
"" <--
property: ""
ctrl_voc: ""
form: ""
user: ""
Отступ соответствует ожидаемому, но клавиши верхних уровней заменяются кавычками (см. Стрелки).
Я получаю тот же вывод, если использую ваше второе предложение с sed
.