jq для замены нескольких вхождений символа только в разделе только определенных строк файла json - PullRequest
1 голос
/ 30 апреля 2020

У меня есть набор файлов, содержащих разделы, подобные следующим:

    "billing_date": {
        "type": "date",
        "meta": {
            "display": "Billing Date",
            "format": ":%x"
        }
    },
    "billing_accounting_date": {
        "type": "date",
        "meta": {
            "display": "Billing Accounting Date",
            "format": ":%x"
        }
    }

Мне нужно изменить содержимое поля «display», чтобы использовать подчеркивания вместо пробелов, поэтому результат будет таким ( обратите внимание на подчеркивание в Billing_Date и Billing_Accounting_Date):

    "billing_date": {
        "type": "date",
        "meta": {
            "display": "Billing_Date",
            "format": ":%x"
        }
    },
    "billing_accounting_date": {
        "type": "date",
        "meta": {
            "display": "Billing_Accounting_Date",
            "format": ":%x"
        }
    }

Пьер Франсуа любезно предложил использовать jq; Я пробовал это, но все еще не смог собрать все это вместе.

Каждый из нескольких файлов имеет несколько десятков различных полей; Мне удалось извлечь нужные замены, но я не вижу, как поместить их обратно в файл.

% jq '.mappings.properties[].meta.display' input.txt                                                                               
"Key"
"Action"
"Transaction Import Time"
"Hash"
"Data Exchange 1.0 Warnings"
"Data Exchange 1.0 Errors"
"Effective Time"
"Import ID"
"Import S3 Key"
"Importing User Name"
"Utility UUID"
"Utility Name"
"Import File Row"
"Account ID"
"Location ID"
"Service Point ID"
"Meter ID"
"Bill ID"
"Register Number"
"Billing Unit Of Measure"
"Billing Cycle Start Date"
"Billing Cycle End Date"
"Billing Cycle Start Read"
"Billing Cycle End Read"
"Billing Cycle Consumption"
"Billing Date"
"Billing Accounting Date"

% jq '.mappings.properties[].meta.display | sub(" "; "_") | sub(" "; "_") | sub(" "; "_") | sub(" "; "_")' input.txt               
"Key"
"Action"
"Transaction_Import_Time"
"Hash"
"Data_Exchange_1.0_Warnings"
"Data_Exchange_1.0_Errors"
"Effective_Time"
etc...

1 Ответ

1 голос
/ 30 апреля 2020

Следующий фильтр jq может использоваться для достижения желаемого результата за один вызов jq:

.billing_date.meta.display |= gsub(" "; "_")
| .billing_accounting_date.meta.display |=  gsub(" "; "_")

Или, возможно, это то, что вы хотите:

.mappings.properties[].meta.display |= gsub(" "; "_") 

Если вы готовы рискнуть перезаписать входной файл, вы можете использовать утилиту sponge из "coreutils".

Использование walk

Вы также можете использовать wi sh рассмотреть возможность использования walk, например, в соответствии с:

walk(if type == "object" and has("display") then .display |= gsub(" "; "_") else . end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...