Анализ строки в сценарии bash

В Ubuntu 16.04 LTS, в оконном менеджере FVWM , я как бы наблюдаю то же самое. Когда я нажимаю Alt + F1 , я перехожу к:

XDG Menu > Gnome Applications > System Tools > Administration > Synaptic Package Manager

Ничего не происходит.

Затем в xterm я запускаю $ synapticи получаю следующее сообщение:

enter image description here

В xterm, когда я запускаю $ sudo synaptic, программа запускается нормально без каких-либо предупреждений/сообщений об ошибках.

0
24.07.2019, 22:14
3 ответа

Использование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возвращает ключевые значения

3
28.01.2020, 02:13

Вы буквально просили 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, показывающих, что происходит, вы можете видеть, что этот код уже длиннее, чем примеры в другом ответе, которые показывают, как это сделать правильно. Таким образом, не используя сторонний -инструмент, вы даете себе больше кода для написания, что займет у вас больше времени как для написания, так и для отладки, и вы также в конечном итоге получаете менее гибкое решение, которое прервется при обнаружении чего-то неожиданного.

5
28.01.2020, 02:13

Кроме того, вы можете использовать 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

1
28.01.2020, 02:13

Теги

Похожие вопросы