Обновление файла конфигурации с помощью скрипта оболочки - PullRequest
0 голосов
/ 27 июня 2018

У меня есть файл конфигурации, который выглядит следующим образом:

define hostgroup {
  hostgroup_name  NA-servers ; The name of the hostgroup
  alias           NA region ; Long name of the group
  members         sample.com ; hosts belonging to this group

}

define hostgroup{
  hostgroup_name  FTP-server ; The name of the hostgroup
  alias           FTP NA region ; Long name of the group
  members         example.com
}

Мне нужно обновить значение members в зависимости от hostgroup_name.

Как мне разобрать вышеуказанный файл?

1 Ответ

0 голосов
/ 27 июня 2018

Этот формат подходит для анализа на основе регулярных выражений:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[1-3].*) echo "ERROR: Bash 4.0 or newer required" >&2; exit 1;; esac
PS4=':$LINENO+'; set -x  # enable trace logging w/ line numbers

start_hostgroup_re='^define[[:space:]]+hostgroup[[:space:]]*[{]'
kv_re='^[[:space:]]*([^[:space:];]+)[[:space:]]+([^;]+)(;.*)?'
end_re='^[[:space:]]*}'

declare -A keys=( ) comments=( )

build_new_members() {  # Replace this with your own code for generating a new member list
  local hostgroup_name=$1 old_members=$2
  echo "New member list for $hostgroup_name"
}

in_hostgroup=0
while IFS= read -r line; do : "line=$line"
  if (( in_hostgroup )); then
    if [[ $line =~ $kv_re ]]; then
      keys[${BASH_REMATCH[1]}]=${BASH_REMATCH[2]}
      comments[${BASH_REMATCH[1]}]=${BASH_REMATCH[3]}
    elif [[ $line =~ $end_re ]]; then
      keys["members"]=$(build_new_members "${keys["hostgroup_name"]}" "${keys["members"]}")
      printf '%s\n' 'define hostgroup {'
      for key in "${!keys[@]}"; do : key="$key"
        value=${keys[$key]}
        comment=${comments[$key]}
        printf '  %-16s %s %s\n' "$key" "$value" "$comment"
      done
      printf '%s\n' '}'
      keys=( ); comments=( ); in_hostgroup=0
    elif [[ $line ]]; then  # warn about non-empty non-assignment lines
      printf 'WARNING: Unrecognized line in hostgroup: %s\n' "$line" >&2
    fi
  else
    if [[ $line =~ $start_hostgroup_re ]]; then
      in_hostgroup=1
    else
      printf '%s\n' "$line"
    fi
  fi
done

См. Этот код работает на https://ideone.com/Z6kvcf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...