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