Bash: Как читать многострочные параметры из конфига olsrd (похоже на nginx)

Как вы анализируете (и модифицируете) следующую конфигурацию: (извлечение из olsrd.conf)

Hna4
{
4.3.2.1 255.255.255.255
#   Internet gateway:
#   0.0.0.0      0.0.0.0
#   more entries can be added:
#   192.168.1.0  255.255.255.0
1.2.3.4 255.255.255.255
2.3.4.5 255.255.255.255
}

Мне нужен этот конфиг (хранится в переменной bash) в следующем формате:

1.2.3.4 255.255.255.255;2.3.4.5 255.255.255.255

А также потребуется это для обратной записи из этого формата в файл olsrd.conf.

(это похоже на конфигурацию nginx, только скобки начинаются со следующей строки.)

После некоторых исследований я использовал grep, чтобы найти номер белья "Hna4" в olsrd.conf, затем с этого момента найдите номер белья в первой закрывающей скобке, затем найдите все строки между этими двумя числами белья, а затем проанализируйте содержимое.

Есть ли другой (лучший) способ добиться этого?

1 ответ

С помощью sed:

$ ips=$(sed -n '/Hna4/,/}/ { /^ *\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/ { N ;/^ *\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/ s/\n/;/ p } } ' < sourcefile)
$ echo $ips
1.2.3.4 255.255.255.255;2.3.4.5 255.255.255.255

Обновить:

Чтобы вывести все IP:

$ ips=$(sed -n '/Hna4/,/}/ { /}/! { /^ *\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/ { H } };/}/ { x; s/\n/;/g; s/^;//; s/\n}//; p }}' file)
$ echo $ips
4.3.2.1 255.255.255.255;1.2.3.4 255.255.255.255;2.3.4.5 255.255.255.255
Другие вопросы по тегам