awk ( авк ):Либо измените, либо добавьте строку, основываясь на ее существовании

StackOverflow https://stackoverflow.com/questions/835180

Вопрос

У меня есть небольшой 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 заржавел, поэтому я не буду предоставлять реальный код.

  • Инициализируйте массив с помощью регулярных выражений и значений.
  • Для каждой строки выполните итерацию массива и выполните соответствующие замены.Очистите использованные записи.
  • В конце выполните итерацию массива и добавьте строки для оставшихся записей.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top