Парсинг конфигов.

Конфиги.

Часто встречается задача обработки конфигурационных файлов.

Замечание

В данном случае я буду использовать конфигурационный файл для самой команды sed, а не как часть более сложной задачи.

К сожалению, для чтения этих файлов не подходят команды r и R, по той причине, что они читают файл не в буфер, а в выходной поток. Кроме того, они не понимают символа `~'. По этой причине мы будем читать конфиг командой s с модификатором e.

Замечание

На самом деле конфиг будет читать команда cat, большие возможности предоставляются в том случае, если команда sed вызывает для чтения конфига другую команду sed.

Формат конфигурационного файла прост:

  1. В кавычках мы записываем начало вывода команды file, например для текстового файла это будет «ASCII text».
  2. Через несколько пробельных символов мы записываем нужное расширение, например для текста это будет «.txt».
  3. Допустимы пустые строки и комментарии начинающиеся с символа `#'.

В прошлом примере мы переименовывали файлы переименованные в номер inode, сейчас мы доделаем этот скрипт, что-бы он читал данные из конфигурационного файла.

Пример 4.14. Пример конфигурационного файла.

$ cat /home/doc/.add_ext.conf
#comment

"XML document text" .xml#
"HTML document text"      .html   #комментарий с пробелами



# комментарий


"PNG image data"                        .png
            		"MP3 file" .mp3
	"ASCII text"            .txt
"JPEG image data"       .jpg

					


Мы загрузим конфиг в область удержания, и после его очистки будем подгружать его к каждому результату работы команды file. Вот сам скрипт:

Пример 4.15. Добавление расширения из конфигурационного файла.

add_ext2.sed
#!/bin/sed -rnf

1 {
	x
	s|.*|cat ~/.add_ext.conf|e
	s/\#.*$//mg
	s/^\s*\n//
	s/^\s+//mg
	s/\s+$//mg
	s/\n+/\n/g
	s/"\s+/" /g
	p
	x
}

/^[0-9]+$/ {
	s//file &/e
	G
	s/^([0-9]+): (.*).*"\2" ([^\n]+)(\n.*)?$/mv -v \1 \1\3/ep
}
					


Для исключения комментариев я использую выражение

/\#.*$/

в многострочном режиме (используется модификатор m). Обратите внимание на выражение

/(\n.*)?$/

в последней команде s - это хвост базы из конфига, которого может и не быть.

Вы можете обсудить этот документ на форуме. Текст предоставляется по лицензии GNU Free Documentation License (Перевод лицензии GFDL).

Вы можете пожертвовать небольшую сумму яндекс-денег на счёт 41001666004238 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.