Ubuntu 20.04의 단일 파일에 toml lens를 사용하는 방법은 무엇입니까?

Ubuntu 20.04의 단일 파일에 toml lens를 사용하는 방법은 무엇입니까?

pcmanfm.conf현재 디렉터리에서 단일 파일( )을 읽고 수정해야 합니다 .

나는 노력했다

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

하지만 작동하지 않습니다. toml.aug(위 /usr/share/augeas/lenses/dist/toml.aug)는 다음으로 시작합니다.

(*
Module: Toml
  Parses TOML files

Author: Raphael Pinson <[email protected]>
...

그래서 렌즈명을 정확하게 입력한 것 같습니다( 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/699Augeas의 버그인 경우.

구문 분석하려는 파일의 내용은 다음과 같습니다.

[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]이 섹션에 값을 추가/교체하고 싶습니다 .

답변1

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_mode변경 하려고 하며 해당 값이 이라는 쉘 변수에 있다고 가정합니다 .compactforward leaningvmode

그런 tomlq다음https://kislyuk.github.io/yq/,

$ 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
  }
}

답변2

Augeas가 파일을 구문 분석할 수 없는 경우 다음을 사용할 수 있습니다.augcheck이유를 알아내는 스크립트:

./augcheck /tmp/test.toml Toml
/tmp/augcheck.h99O5K/parse_file.aug:3.0-.54:exception thrown in test
/tmp/augcheck.h99O5K/parse_file.aug:3.5-.50:exception: Syntax error
    Lens: /usr/share/augeas/lenses/dist/toml.aug:145.10-.45:
    Error encountered at 20:15 (290 characters into string)
    <s_previous=0\nside_pane_mode=|=|places\nview_mode=compact\nsho>

    Tree generated so far:
    

Syntax error in lens definition
Failed to load /tmp/augcheck.h99O5K/parse_file.aug

이는 Augeas가 다음 줄을 구문 분석할 수 없음을 나타냅니다 side_pane_mode=planes. 렌즈로 판단하면 TOML 렌즈는 현재 인용된 문자열만 지원하는 것으로 보입니다.

관련 정보