#json #linux #sed #jq
Вопрос:
у нас есть следующий json
файл ( пример с grep
)
grep DB_SERVER_CV02.localdomain /home/main.json
"hadoop.proxyuser.ambari.hosts": "DB_SERVER_CV02.localdomain",
"yarn.timeline-service.http-authentication.proxyuser.ambari.hosts": "DB_SERVER_CV02.localdomain",
"timeline.metrics.service.webapp.address": "DB_SERVER_CV02.localdomain:6188",
"javax.jdo.option.ConnectionURL": "jdbc:postgresql://DB_SERVER_CV02.localdomain:5432/hive",
"webhcat.proxyuser.ambari.hosts": "DB_SERVER_CV02.localdomain",
.
.
.
.
.
DB_SERVER_CV02.localdomain
слово появляется в файле более 56 раз main.json
и мы хотим DB_SERVER_CV02.localdomain
заменить APP_SERVER_CV02.localdomain
имя на
самый простой способ-просто сделать это с sed
помощью as
sed -i s'/DB_SERVER_CV02.localdomain/APP_SERVER_CV02.localdomain/g' /home/main.json
но, как я понимаю, лучше работать с jq
файлами при работе с ними json
каков правильный подход для замены DB_SERVER_CV02.localdomain
с APP_SERVER_CV02.localdomain
на с jq
?
Комментарии:
1. В данном случае
sed
все проще и так же хорошо.jq
было бы уместно, если бы вы хотели произвести замену только в определенных свойствах.2. Пожалуйста, предоставьте действительный, хорошо сформированный пример ввода JSON и желаемые результаты (хотя и не с 56 повторениями… 2 или 3 достаточно для целей демонстрации и тестирования).
Ответ №1:
В отсутствие дополнительной информации вы можете рассмотреть возможность «глобального поиска и замены» строк (помимо ключей).:
walk(if type == "string"
then sub("DB_SERVER_CV02[.]localdomain"; "APP_SERVER_CV02.localdomain")
else . end)
Вы можете настроить sub
команду (или изменить ее на gsub
) в зависимости от ваших реальных требований.
(Вы могли бы включить вышеуказанную walk
программу в командную строку, но я бы рекомендовал поместить ее в файл и использовать jq с опцией-f.)
Если вы хотите изменить все вхождения, даже в ключах, то , возможно, вы сможете использовать sed
, но вы также можете использовать jq с walk
использованием, как показано выше, но с использованием with_entries
для ключей. Однако, поскольку вы специально не упомянули об этом, это, возможно, можно оставить в качестве упражнения.