jq каков правильный подход для замены слова, которое повторилось 56 раз в json

#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 для ключей. Однако, поскольку вы специально не упомянули об этом, это, возможно, можно оставить в качестве упражнения.