Вложенные структуры, а именно JSON, должны обрабатываться (структурными подпрограммами JSON ). Всякий раз, когда вы пытаетесь обработать его с помощью (нескольких )строк -, поддерживающих только подпрограммы, вы всегда будете подвергаться ложным -срабатываниям.
Таким образом, ваш запрос (еще раз, поскольку его правильно сформированный JSON )легко достижим с помощьюjtc
:
bash $ jtc -w'[list-value]l' -u'"example-value-changed-567"' file.json
{
"list-value": {
"object-value": {
"value": "example-value-changed-567"
}
}
}
bash $
Я могу получить желаемое поведение, используя следующий набор функций. IDK, насколько это оптимальное решение, но если у кого-то есть идеи по улучшению этого, я был бы рад услышать об этом.
#!/usr/bin/env bash
# this is a simple config for herbstluftwm
hc() {
herbstclient "$@"
}
use_empty_index()
{
hc use_previous
local previous_tag=$(hc attr tags.focus.index)
hc use_previous
local origin_tag=$(hc attr tags.focus.index)
local tag=$(hc use_index $1)
while [[ $tag != $origin_tag ]] && [ $(hc attr tags.focus.client_count) == 0 ];
do
tag=$(hc use_index $1)
done
tag=$(hc attr tags.focus.index)
hc use_index $previous_tag
hc use_index $tag
}
is_first_client_in_tag()
{
v=$(echo $1 | grep ^0*$)
local curframe_windex=$(hc attr tags.focus.curframe_windex)
if [[ ${v:0:1} == 0 ]] && [[ $curframe_windex == 0 ]]; then
echo 1
fi
}
is_last_client_in_tag()
{
v=$(echo $1 | grep ^1*$)
local curframe_windex=$(hc attr tags.focus.curframe_windex)
local curframe_wcount=$(hc attr tags.focus.curframe_wcount)
if [[ ${v:0:1} == 1 ]] && [[ $curframe_windex == $(($curframe_wcount - 1)) ]]; then
echo 1
fi
}
cycle_focus_all_tags()
{
local v=$(hc attr clients.focus.parent_frame.index)
if [[ $v == '' ]]; then
use_empty_index $1
elif [ $1 == "+1" ] && [[ $(is_last_client_in_tag $v) == 1 ]]; then
use_empty_index $1
elif [ $1 == "-1" ] && [[ $(is_first_client_in_tag $v) == 1 ]]; then
use_empty_index $1
else
hc cycle_all $1
fi
}