2009-05-07 7 views
1

У меня есть небольшой скрипт awk, который делает некоторые изменения в локальном файле (для файла Java .properties, чтобы дать вам представление). Это часть сценария развертывания, влияющего на группу пользователей.awk: Либо измените, либо добавьте строку на основе ее существования.

Я хочу иметь возможность устанавливать значения по умолчанию, оставляя остальную часть файла по желанию пользователя. Это означает добавление строки конфигурации, если она отсутствует, изменяя ее, если она есть, оставляя все остальное как есть.

В настоящее время я использую что-то вроде этого:

# 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/все будет намного проще. :-)

+0

То, что вы выложили, кажется, AWK, не СЭД. – 2009-05-07 15:01:18

+0

Я был настолько обернут письмом, что даже не заметил. Исправленный. – Tomalak

+3

Perl/Python/Все было бы намного проще ;-) –

ответ

4
BEGIN { 
    defaults["some.value"] = "SOME VALUE" 
    defaults["other.value"] = "OTHER VALUE" 
} 

{ 
    for (key in defaults) { 
     pattern = key 
     gsub(/\./, "\\.", pattern) 
     if (match($0, "^" pattern "=.*")) { 
      gsub(/=.*/, "=" defaults[key]) 
      delete defaults[key] 
     } 
    } 
    print $0 
} 

END { 
    for (key in defaults) { 
     print key "=" defaults[key] 
    } 
} 
+0

* The * решение. Порядок ключей по умолчанию зависит от хеша, поэтому окончательные неиспользуемые ключи не будут отображаться в том же порядке, что и объявление, но это незначительная проблема. – richq

+0

@Sean Bright: Красиво, спасибо. Бонусный вопрос: как я буду регулярным выражением - избегайте ключа в вашем цикле for? Он работает сейчас, но точки на самом деле совпадают только случайно. – Tomalak

+0

@Tomalak: Смотрите мое редактирование –

2

Мой AWK ржавый, поэтому я не буду предоставлять действительный код.

  • Инициализировать массив с помощью регулярных выражений и значений.
  • Для каждой строки итерации массива и соответствующих подстановок. Очистите использованные записи.
  • В завершение повторите попытку массива и добавьте строки для оставшихся записей.
+0

По сути, это именно то, что реализовал @Sean Bright. +1 – Tomalak