awk ( авк ):Либо измените, либо добавьте строку, основываясь на ее существовании
-
08-07-2019 - |
Вопрос
У меня есть небольшой awk-скрипт, который выполняет некоторые изменения файла на месте (для Java .properties
файл, чтобы дать вам представление).Это часть сценария развертывания, затрагивающего множество пользователей.
Я хочу иметь возможность устанавливать значения по умолчанию, оставляя остальную часть файла на усмотрение пользователя.Это означает добавление строки конфигурации, если она отсутствует, изменение ее, если она есть, и оставление всего остального как есть.
В настоящее время я использую что-то вроде этого:
# initialize
BEGIN {
some_value_set = 0
other_value_set = 0
some_value_default = "some.value=SOME VALUE"
other_value_default = "other.value=OTHER VALUE"
}
# modify existing lines
{
if (/^some\.value=.*/)
{
gsub(/.*/, some_value_default)
some_value_set = 1
}
else if (/^other\.value=.*/)
{
gsub(/.*/, other_value_default)
other_value_set = 1
}
print $0
}
# append missing lines
END {
if (some_value_set == 0) print some_value_default
if (other_value_set == 0) print other_value_default
}
Особенно, когда количество строк, которыми я хочу управлять, становится больше, это становится все более громоздким.Мои знания awk не так уж велики, и вышесказанное просто чувствует неправильно - как я могу упростить это?
P.S.:Если возможно, я бы хотел остаться с awk.Пожалуйста, не просто рекомендуйте использовать Perl / Python / что угодно, что было бы намного проще.:-)
Решение
BEGIN {
defaults["some.value"] = "SOME VALUE"
defaults["other.value"] = "OTHER VALUE"
}
{
for (key in defaults) {
pattern = key
gsub(/\./, "\\.", pattern)
if (match(<*>, "^" pattern "=.*")) {
gsub(/=.*/, "=" defaults[key])
delete defaults[key]
}
}
print <*>
}
END {
for (key in defaults) {
print key "=" defaults[key]
}
}
Другие советы
Мой AWK заржавел, поэтому я не буду предоставлять реальный код.
- Инициализируйте массив с помощью регулярных выражений и значений.
- Для каждой строки выполните итерацию массива и выполните соответствующие замены.Очистите использованные записи.
- В конце выполните итерацию массива и добавьте строки для оставшихся записей.