Удалите \ n после имени папки, чтобы вы искали команду
macro index s ":set confirmappend=no delete=yes auto_tag=yes\n\
<save-message>=archive<sync-mailbox>:set delete=ask-yes\n"
jq
имеет несколько подходящих встроенных функций. Вам не нужно много трюков с Bash, и он не очень хорошо подходит для решения проблемы.Вот довольно явная версия в jq, которую вы сможете изменить для любой цели, которая вам нужна:
jq -r '. as $root |
path(..) |. as $path |
$root | getpath($path) as $value |
select($value | scalars) |
([$path[] | @json] | join(".")) + " = " + ($value | @json)
' < file.json
Он использует оператор привязки переменных... as $identifier |
несколько раз, чтобы запомнить вычисляемые значения по имени -некоторые из них не нужны, но они облегчают обсуждение. Каждая из этих строк связывает переменную $x
для оставшейся части программы со значением слева.
Функцияpath/1
является ключевой здесь и делает в основном то, что вы хотите уже:path(..)
создает массив всех ключей, которые вам нужно пройти, чтобы добраться до каждого значения, вложенного в объект. Каждый путь имеет вид
[ "Blueprints", "security", "kerberos_descriptor" ]
и их можно использовать так же, как и другие массивы, а также со специальными функциями, интерпретирующими пути.
path(..) |. as $path |
, в частности, определяет цикл :для каждого пути в файле, вызывает его $path
и запускает остальную часть программы как тело цикла. Остальная часть программы выбирает и выводит, поэтому для каждого пути он проверяется и, возможно, генерируется выходная строка.
getpath
считывает один из этих массивов путей и извлекает идентифицируемое им значение.select
позволяет нам фильтровать только те значения, которые проходят тест -здесь выбираются только значения, которые являются скалярами(числами, строками, логическими значениями или нулями ), поэтому промежуточные объекты и массивы не учитываются (, как и нули ).
Последняя строка форматирует вывод как
"abc"."def".3."xyz" = true
для каждого значения в файле, по одному на строку, и вы можете настроить это по своему усмотрению. Перенаправьте его в файл, и вы сможете grep
просмотреть его несколько раз.
@json
корректно заключает значения в кавычки, а остальные должны быть легко изменены в соответствии с нужным вам форматом. Он не использует квадратные скобки для массивов, потому что вручную воспроизвести функциональность join
для расстановки точек для других случаев на удивление сложно. Скобки нужны с обеих сторон.