Заменить текст специальными символами с помощью sed - PullRequest
0 голосов
/ 18 июня 2020

У меня есть такая строка json,

rssample='{ "Changes": [{"Action": "UPSERT","ResourceRecordSet": {"ResourceRecords":[{ "Value":""}], "Type": "TXT","NAME":"","TTL": 300}}]}'

Я хочу обновить в ней ИМЯ и значение, используя следующие переменные ..

name="testname"
newvalue="heritage=external-dns,external-dns/owner=us-east-1:sandbox-newtestowner,external-dns/resource=ingress/monitoring/prometheus-operator-alertmanager"

Итак, я попробовал используя sed,

   newrs=$(sed -E "s/"NAME":""/"NAME":"$name"/g" <<< "$rssample")
   newrs1=$(sed -E "s/"Value":""/"Value":"\$newvalue"/g" <<< "$newrs")

Я ожидаю, что ниже будет вывод,

{ "Changes": [{"Action": "UPSERT","ResourceRecordSet": {"ResourceRecords":[{ "Value":"\"heritage=external-dns,external-dns/owner=us-east-1:sandbox-newtestowner,external-dns/resource=ingress/monitoring/prometheus-operator-alertmanager\""}], "Type": "TXT","NAME":"testname","TTL": 300}}]}

Но у меня пустое имя. И получаю ошибку для значения как,

sed: 1: "s/Value:/Value:"heritag ...": bad flag in substitute command: 'o'

Мой вывод: {"Changes": [{"Action": "UPSERT", "ResourceRecordSet": {"ResourceRecords": [{"Value": ""}], "Type": "TXT", "NAME") : "", "TTL": 300}}]}

Пожалуйста, дайте мне знать, как это исправить? использует sed хорошая идея или jq?

1 Ответ

3 голосов
/ 18 июня 2020

Как правило, безопаснее и, следовательно, лучше использовать инструмент, поддерживающий JSON, а не sed при редактировании JSON. При использовании jq возможен следующий вариант:

jq --arg name "$name" --arg newvalue "$newvalue" '
  .Changes[0].ResourceRecordSet |= 
    (.NAME=$name
   | .ResourceRecords[0].Value = $newvalue)' <<< "$rssample"

Подход свободной формы

jq --arg name "$name" --arg newvalue "$newvalue" '
  walk(if type == "object" 
       then if has("NAME") then .NAME=$name else . end 
            | if has("Value") then .Value = $newvalue else . end
        else . end)' <<< "$rssample"
...