Использование sed для универсального заменителя - PullRequest
0 голосов
/ 07 июля 2019

Мне вручают файл с разными записями конфигурации Строки из примера ввода:

       "configuration_name_1": "configuration_value_1"
  configuration_name_2 : configuration_value_2 
  "configuration_name_3": 'configuration_value_3'
  "configuration_name_4": configuration_value_4

Эти значения должны выступать в качестве заменителей в разных файлах (по расположению и типу - JSON, yaml и т. Д.). Невозможно реализовать единый тип файла для всего решения, и о добавлении дополнительных инструментов на хост не может быть и речи.

Мне удалось обрезать все конфигурации до ключа : значение во временном файле. Пример:

configuration_name_1:configuration_value_1
configuration_name_2:configuration_value_2 
configuration_name_3:configuration_value_3

Следующий шаг - переопределить значения в разных файлах. Файл example.yaml содержит (имейте в виду, yaml чувствителен к отступам):

  configuration_name_1: "test"
  configuration_name_2:  123 

example.yaml должен быть изменен на:

  configuration_name_1: "configuration_value_1"
  configuration_name_2:  configuration_value_2

example.json содержит

{
 "configuration_name_3": "abcd"
 "configuration_name_4":  5555
}

example.json должен быть изменен на:

{
 "configuration_name_3": "configuration_value_3"
 "configuration_name_4":  configuration_value_4
}

Есть ли способ переопределить значения для определенных ключей в целевых файлах, игнорируя при этом форматирование?

1 Ответ

3 голосов
/ 07 июля 2019

sed - это простой s / old / new для отдельных строк, это все . Для всего остального вы должны использовать awk, например с GNU awk для gensub () и третьим аргументом для сравнения ():

$ cat tst.awk
NR == FNR {
    tag = gensub(/:.*/,"",1)
    val = gensub(/[^:]+:/,"",1)
    gsub(/^\s*["\047]?|["\047]?\s*$/,"",tag)
    gsub(/^\s*["\047]?|["\047]?\s*$/,"",val)
    tag2val[tag] = val
    next
}
match($0,/^(\s*([^:]+)[:[:space:]]+)(.*)$/,a) {
    tag = a[2]
    gsub(/^"|"$/,"",tag)
    if ( tag in tag2val ) {
        delim = (gsub(/^"|"$/,"",a[3]) ? "\"" : "")
        $0 = a[1] delim tag2val[tag] delim
    }
}
{ print }

$ cat foo.map
       "configuration_name_1": "configuration_value_1"
  configuration_name_2 : configuration_value_2
  "configuration_name_3": 'configuration_value_3'
  "configuration_name_4": configuration_value_4

$ awk -f tst.awk foo.map example.yaml example.json
  configuration_name_1: "configuration_value_1"
  configuration_name_2:  configuration_value_2
{
 "configuration_name_3": "configuration_value_3"
 "configuration_name_4":  configuration_value_4
}

и сделать изменения "на месте", если вы этого хотите:

$ cat example.yaml
  configuration_name_1: "test"
  configuration_name_2:  123

$ cat example.json
{
 "configuration_name_3": "abcd"
 "configuration_name_4":  5555
}

$ awk -i inplace -f tst.awk foo.map example.yaml example.json

$ cat example.yaml
  configuration_name_1: "configuration_value_1"
  configuration_name_2:  configuration_value_2

$ cat example.json
{
 "configuration_name_3": "configuration_value_3"
 "configuration_name_4":  configuration_value_4
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...