В Ubuntu 16.04 LTS, в оконном менеджере FVWM , я как бы наблюдаю то же самое. Когда я нажимаю Alt + F1 , я перехожу к:
XDG Menu > Gnome Applications > System Tools > Administration > Synaptic Package Manager
Ничего не происходит.
Затем в xterm я запускаю $ synaptic
и получаю следующее сообщение:
В xterm, когда я запускаю $ sudo synaptic
, программа запускается нормально без каких-либо предупреждений/сообщений об ошибках.
Использованиеjq
:
id='{"name":"john"}'
key=$(jq -r keys[] <<<"$id")
value=$(jq -r.[] <<<"$id")
-r
:С этой опцией, если результатом фильтра является строка, она будет записана непосредственно в стандартный вывод, а не отформатирована как строка JSON с кавычками.
keys
:Встроенные функциональные клавиши при передаче объекта возвращают его ключи в виде массива.
Использованиеjson
:
id='{"name":"john"}'
key=$(json -ak <<<"$id")
value=$(json -a "$key" <<<"$id")
-a
обрабатывает ввод как массив
-k
возвращает ключевые значения
Вы буквально просили understand string parsing in bash
, так что я напишу ответ с учетом этого, хотя это неправильное решение вашей проблемы . Вы можете использовать сам bash, чтобы делать то, что вы хотите,еслиу вас есть действительно чистые данные без специальных символов, где специальный определяется как что-либо за пределами[A-Za-z0-9 ]
:
$ id='{"name":"john"}'
$ id="${id#*\{}" # remove everything through the first '{'
$ echo $id
"name":"john"}
$ id="${id%\}*}" # remove everything starting with the last '}'
$ echo $id
"name":"john"
$ name="${id%:*}" # take everything before the ':'
$ name="${name//\"/}" # remove quotes
$ echo $name
name
$ value="${id#*:}" # take everything after the ':'
$ value="${value//\"/}" # remove quotes
$ echo $value
john
Все это описано в разделе «Расширение параметров» в руководстве bash . Например, ${parameter#word}
вместо Remove matching prefix pattern
удалит текст word
с начала $parameter
. Точно так же %
удаляет суффикс. //
заменяет все вхождения строки на то, что идет после нее (в приведенном выше примере ${foo//\"/}
, кавычки (, которые должны быть экранированы, поэтому отображаются как\"
)заменяются пустой строкой ). Вы должны выполнять каждую замену отдельно, хотя :вы не можете удалить начало и конец строки одной командой.
Вы также, вероятно, заметили, что вам нужно экранировать специальные символы, такие как }
, {
и "
. Пока вы помните, что это правильно, вы можете написать код, подобный этому, довольно легко, но, как бы просто это ни было, он имеет тенденцию к написанию -только кода. Когда вы вернетесь к этому коду через год или два, чтобы снова -использовать его, вы посмотрите на что-то вроде #*\{}
и подумаете про себя: Что это вообще значит? , а затем просто скопируйте его вслепую в новый проект, и тогда ваш код слегка сломается, потому что он встретит специальные символы, которых вы не ожидали.
Приведенные выше примеры не работают, если в парах значений вашего имени -есть специальные символы, такие как фигурные скобки, экранированные кавычки, двоеточия или, возможно, другие символы. Таким образом, это будет хорошо работать для быстрого -и -грязного извлечения или варианта использования 80%, но вам действительно не следует использовать его в производстве или в любое время, когда вам нужно убедиться, что он всегда работает с любым вводом.
Даже без операторов echo
, показывающих, что происходит, вы можете видеть, что этот код уже длиннее, чем примеры в другом ответе, которые показывают, как это сделать правильно. Таким образом, не используя сторонний -инструмент, вы даете себе больше кода для написания, что займет у вас больше времени как для написания, так и для отладки, и вы также в конечном итоге получаете менее гибкое решение, которое прервется при обнаружении чего-то неожиданного.
Кроме того, вы можете использовать unix-утилиту для обхода пути -jtc
:
id='{"name":"john"}'
bash $ key=$(jtc -w'[0]<>k' <<<"$id")
bash $ echo $key
"name"
bash $ value=$(jtc -w'[0]' <<<"$id")
bash $ echo $value
"john"
bash $
PS> Раскрытие информации :Я создательjtc
-командной оболочки для операций JSON