我有这样的数据:
['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom6/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom7/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom8/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom9/']
Run Code Online (Sandbox Code Playgroud)
我希望每行每个值都没有引号,以便我可以将其通过管道传输到另一个命令,例如:
/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/
/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/
....
Run Code Online (Sandbox Code Playgroud)
awk -F'[][]' '{print $2}'
删除方括号。我不明白如何进一步进行。
您可以删除前导['
、尾随并用换行符']
替换所有内容,然后删除我看到的用于表示空字符串列表的或行(其中前缀指定该数组是一个字符串数组)。', '
[]
@as []
gsettings
@as
a
s
gsettings get some-path some-array-key... |
sed "/^@as \[\]\$/d
/^\[\]\$/d
s/^\['//
s/'\]\$//
s/', '/\\
/g"
Run Code Online (Sandbox Code Playgroud)
使用 GNU sed
,上面最后一个命令中替换中的换行符s
可以表示为\n
而不是\
后面跟着文字换行符。
如果不是空列表的'...'
替代"..."
和那个@as
前缀,那将是一个有效的 JSON 数组,所以你也可以这样做:
gsettings get some-path some-array-key |
sed "y/'/\"/; s/^@as //" |
jq -r '.[]'
Run Code Online (Sandbox Code Playgroud)
请注意,这些都不适用于任意字符串数组,因为它们没有考虑可以通过gsettings
以下方式完成的转义:
$ gsettings list-recursively | grep '\\'
org.freedesktop.ibus.panel.emoji favorites ['\u200b']
org.gnome.evolution.shell filename-illegal-chars "'\"&`();|<>$%{}!"
Run Code Online (Sandbox Code Playgroud)
(我们甚至可以看到它切换到"..."
最后一种情况,其中字符串值包含 a '
,在这种情况下使其成为正确的 JSON 字符串)。
$ gsettings set org.gnome.seahorse last-search-text $'\1\xa\U10FFFF\'\"\\'
$ gsettings get org.gnome.seahorse last-search-text
"\u0001\n\U0010ffff'\"\\"
Run Code Online (Sandbox Code Playgroud)
该格式似乎是https://developer-old.gnome.org/glib/stable/gvariant-text.html中描述的格式
该JSON:PP
perl
模块支持使用单引号分隔符的 JSON 字符串,因此您可以使用它来提取和解码任何 GVariant 对象中的任何单引号或双引号字符串,如下所示:
gsettings any-path any-key |
perl -C -MJSON::PP -lne '
BEGIN{
$j = JSON::PP->new->allow_singlequote
}
print $j->decode($_) for
/'\''(?:\\.|[^\\'\''])*'\''|"(?:\\.|[^\\"])*"/g'
Run Code Online (Sandbox Code Playgroud)
正则表达式找到一对'...'
或"..."
(允许内部转义引号或反斜杠),并将其传递给 JSON 解码器。忽略JSON:PP 会阻塞为 AFAICT 的 , 字节串,b'...'
将其输出为。b"..."
gsettings
[byte 0xHH, 0xHH...]