Как с помощью Augeas можно изменить значение атрибута, используя текущее значение?

Как с помощью Augeas можно изменить значение атрибута, используя текущее значение?

Допустим, у меня есть некий общий файл типа INI, лучше всего покрытый Samba.lns. У меня есть запись типа:

attribute = value

И я хочутрансформировать valueк Some-VALUE-x. Для более конкретного примера:

augtool> print /files/etc/yum.conf/main/cachedir
/files/etc/yum.conf/main/cachedir = "/var/cache/yum/$basearch/$releasever"

И я хочу изменить значение на:

"/var/cache/yum/noarch/$releasever"

То есть, я хочу заменить $basearchна noarchи оставить остальное в покое. Мой реальный пример немного сложнее. Могу ли я вообще сделать это в augeas?

решение1

Это невозможно сделать с помощью одного вызова API Augeas, но с помощью aug_get и aug_set это можно сделать на языке вызова. Например, используя ruby-augeas:

aug.set("/files/etc/yum.conf/main/cachedir", aug.get("/files/etc/yum.conf/main/cachedir").sub("$basearch", "noarch"))

Если вы используете augtool в вашем примере, в оболочке вы можете сделать следующее:

cachedir=$(augtool get /files/etc/yum.conf/main/cachedir | sed 's/$basearch/noarch/')
augtool set /files/etc/yum.conf/main/cachedir "$cachedir"

решение2

Стандартный Shellvars_listобъектив почти соответствует тому, что мне нужно.

Имея такой файл, как

GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vgroot/lvswap rd.lvm.lv=vgroot/lvroot"
GRUB_DISABLE_RECOVERY="true"

Я хочу добавить произвольные значения идемпотентным способом в GRUB_CMDLINE_LINUX. Эта линза анализирует этот файл следующим образом:

augtool> print $v
/files/home/c14027/default-grub-sample
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT/quote = ""
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT/value = "5"
/files/home/c14027/default-grub-sample/GRUB_DEFAULT
/files/home/c14027/default-grub-sample/GRUB_DEFAULT/quote = ""
/files/home/c14027/default-grub-sample/GRUB_DEFAULT/value = "saved"
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU/quote = ""
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU/value = "true"
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT/value = "console"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[1] = "crashkernel=auto"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[2] = "rd.lvm.lv=vgroot/lvsap"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[3] = "rd.lvm.lv=vgroot/lvroot"
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY/value = "true"

Мы сделаем это defvarв augtool, чтобы он $vпредставлял наш префикс.

Добавьте новое значение к этому CMDLINEпараметру:

set $v/GRUB_CMDLINE_LINUX/value[last()+1] test=142

Удалить существующие:

rm $v/GRUB_CMDLINE_LINUX/value[. =~ regexp("^test=.*")]

Замените пару ключей, ключ которой test=:

set $v/GRUB_CMDLINE_LINUX/value[. =~ regexp("^test=.*")] test=1234

Связанный контент