Bash

如何在 Ubuntu 20.04 上的單個文件上使用 toml 鏡頭?

  • August 25, 2021

我需要讀取和修改pcmanfm.conf目前目錄中的單個文件 ( )。

我試過了

$ augtool -At "Toml.lns incl $(pwd)/pcmanfm.conf" -I lenses/ print /files
/files

但它不起作用。toml.aug(on /usr/share/augeas/lenses/dist/toml.aug) 以

(*
Module: Toml
 Parses TOML files

Author: Raphael Pinson <raphael.pinson@camptocamp.com>
...

所以我相信我正確地輸入了鏡頭的名稱(Toml.lns)。

如果我解析不同類型的文件,相同的設置效果很好,例如

$ augtool -At "Shellvars.lns incl /tmp/vars.sh" -I lenses/ print /files
/files
/files/tmp
/files/tmp/vars.sh
/files/tmp/vars.sh/TESTINT = "2"
/files/tmp/vars.sh/TESTSTR = "\"FF\""

我已經在https://github.com/hercules-team/augeas/issues/699上發布了同樣的問題,以防它是 Augeas 中的一個錯誤。

我嘗試解析的文件具有以下內容:

[config]
bm_open_method=0

[volume]
mount_on_startup=1
mount_removable=1
autorun=1

[ui]
always_show_tabs=0
max_tab_chars=32
win_width=1916
win_height=1149
splitter_pos=150
media_in_new_tab=0
desktop_folder_new_win=0
change_tab_on_drop=1
close_on_unmount=1
focus_previous=0
side_pane_mode=places
view_mode=compact
show_hidden=0
sort=name;ascending;
toolbar=newtab;navigation;home;
show_statusbar=1
pathbar_mode_buttons=0

我想在該[ui]部分中添加/替換一個值。

TOML 規範指定必須引用字元串(請參閱https://toml.io/en/v1.0.0#string)。您的文件的更正變體看起來像

[config]
bm_open_method=0

[volume]
mount_on_startup=1
mount_removable=1
autorun=1

[ui]
always_show_tabs=0
max_tab_chars=32
win_width=1916
win_height=1149
splitter_pos=150
media_in_new_tab=0
desktop_folder_new_win=0
change_tab_on_drop=1
close_on_unmount=1
focus_previous=0
side_pane_mode="places"
view_mode="compact"
show_hidden=0
sort="name;ascending;"
toolbar="newtab;navigation;home;"
show_statusbar=1
pathbar_mode_buttons=0

然後,您想要替換該ui部分中的值。假設您想view_modecompactto更改,forward leaning並且您在一個名為 的 shell 變數中有這個值vmode

然後,使用https://kislyuk.github.io/yq/tomlq中的工具,

$ vmode='forward leaning'
$ tomlq -t --arg vmode "$vmode" '.ui.view_mode |= $vmode' pcmanfm.conf
[config]
bm_open_method = 0

[volume]
mount_on_startup = 1
mount_removable = 1
autorun = 1

[ui]
always_show_tabs = 0
max_tab_chars = 32
win_width = 1916
win_height = 1149
splitter_pos = 150
media_in_new_tab = 0
desktop_folder_new_win = 0
change_tab_on_drop = 1
close_on_unmount = 1
focus_previous = 0
side_pane_mode = "places"
view_mode = "forward leaning"
show_hidden = 0
sort = "name;ascending;"
toolbar = "newtab;navigation;home;"
show_statusbar = 1
pathbar_mode_buttons = 0

tomlq工具使用jq語法來訪問和修改文件。.ui.view_mode路徑是我們決定要更改的路徑,$vmode也是我們將其更新到的值。這是一個內部變數,我們在命令行使用--arg.


作為參考,該tomlq實用程序在內部使用從您的 TOML 文件創建的 JSON 文件,看起來像

{
 "config": {
   "bm_open_method": 0
 },
 "volume": {
   "mount_on_startup": 1,
   "mount_removable": 1,
   "autorun": 1
 },
 "ui": {
   "always_show_tabs": 0,
   "max_tab_chars": 32,
   "win_width": 1916,
   "win_height": 1149,
   "splitter_pos": 150,
   "media_in_new_tab": 0,
   "desktop_folder_new_win": 0,
   "change_tab_on_drop": 1,
   "close_on_unmount": 1,
   "focus_previous": 0,
   "side_pane_mode": "places",
   "view_mode": "compact",
   "show_hidden": 0,
   "sort": "name;ascending;",
   "toolbar": "newtab;navigation;home;",
   "show_statusbar": 1,
   "pathbar_mode_buttons": 0
 }
}

引用自:https://unix.stackexchange.com/questions/614943