如何使用jq查找并用shell变量替换json?

时间:2019-04-20 05:48:45

标签: json shell sh jq

我从json对象读取了jq的属性,并将其存储到变量中。

我现在想阅读这些变量,并从根本上在字符串中找到一个单词并将其替换为全局shell变量。

我已经从JSON文件中设置了JSON ID

# Set Json ID's
TARGET_ID=$(jq '.DefaultCacheBehavior.TargetOriginId' distconfig.json)
DOMAIN_NAME=$(jq '.Origins.Items[0].DomainName' distconfig.json)
ORIGIN_ID=$(jq '.Origins.Items[0].Id' distconfig.json)

echo "$TARGET_ID"
echo "$DOMAIN_NAME"
echo "$ORIGIN_ID"

这将返回

"S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com"
"stag4.example.io.s3-website.us-east-2.amazonaws.com"
"S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com"

我有我的位置ID变量,并希望将其写入以查找和替换这3个ID中的所有stag4引用。

然后,我想将这3个ID写入初始json对象,或为其创建一个临时版本。

例如,如果: $DOMAIN_NAME"stag4.example.io.s3-website.us-east-2.amazonaws.com"

我基本上希望将其设置为:

$LOCATION_NAME="stag6"
DOMAIN_LOCATION="example.io"
"$DOMAIN_NAME=S3-Website-\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"
"$TARGET_ID=\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"
"$ORIGIN_ID=S3-Website-\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"

然后将这3个文件写入临时文件或新的json文件中,这样我就可以运行cloudformation命令了:

aws cloudfront create-distribution --distribution-config file://disttemp.json

我现在已经从初始json文件中构建了适当的变量,如下所示:

$LOCATION_NAME="stag6"
DOMAIN_LOCATION="example.io"
echo "Build New IDs"
TARGET_ID_BUILT="S3-Website-$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"
DOMAIN_NAME_BUILT="$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"
ORIGIN_ID_BUILT="S3-Website-$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"

echo "$TARGET_ID_BUILT"
echo "$DOMAIN_NAME_BUILT"
echo "$ORIGIN_ID_BUILT"

如何使用jq将这些变量写入json文件?

编辑:请求distconfig.json的示例–域/信条交换为示例

{
  "CallerReference": "my-test-distribution-2",
  "Comment": "", 
  "CacheBehaviors": {
      "Quantity": 0
  }, 
  "IsIPV6Enabled": true, 
  "Logging": {
      "Bucket": "", 
      "Prefix": "", 
      "Enabled": false, 
      "IncludeCookies": false
  }, 
  "WebACLId": "", 
  "Origins": {
      "Items": [
          {
              "OriginPath": "", 
              "CustomOriginConfig": {
                  "OriginSslProtocols": {
                      "Items": [
                          "TLSv1", 
                          "TLSv1.1", 
                          "TLSv1.2"
                      ], 
                      "Quantity": 3
                  }, 
                  "OriginProtocolPolicy": "http-only", 
                  "OriginReadTimeout": 30, 
                  "HTTPPort": 80, 
                  "HTTPSPort": 443, 
                  "OriginKeepaliveTimeout": 5
              }, 
              "CustomHeaders": {
                  "Quantity": 0
              }, 
              "Id": "S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com", 
              "DomainName": "stag4.example.io.s3-website.us-east-2.amazonaws.com"
          }
      ], 
      "Quantity": 1
  },
}
"DefaultRootObject": "", 
  "PriceClass": "PriceClass_All", 
  "Enabled": true, 
  "DefaultCacheBehavior": {
      "TrustedSigners": {
          "Enabled": false, 
          "Quantity": 0
      }, 
      "LambdaFunctionAssociations": {
          "Quantity": 0
      }, 
      "TargetOriginId": "S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com", 
      "ViewerProtocolPolicy": "redirect-to-https", 
      "ForwardedValues": {
          "Headers": {
              "Quantity": 0
          }, 
          "Cookies": {
              "Forward": "none"
          }, 
          "QueryStringCacheKeys": {
              "Quantity": 0
          }, 
          "QueryString": false
      }, 
      "MaxTTL": 31536000, 
      "SmoothStreaming": false, 
      "DefaultTTL": 86400, 
      "AllowedMethods": {
          "Items": [
              "HEAD", 
              "GET"
          ], 
          "CachedMethods": {
              "Items": [
                  "HEAD", 
                  "GET"
              ], 
              "Quantity": 2
          }, 
          "Quantity": 2
      }, 
      "MinTTL": 0, 
      "Compress": true
  }, 
  "ViewerCertificate": {
      "SSLSupportMethod": "sni-only", 
      "ACMCertificateArn": "xxxx", 
      "MinimumProtocolVersion": "TLSv1.1_2016", 
      "Certificate": "xxxx", 
      "CertificateSource": "acm"
  }, 
  "CustomErrorResponses": {
      "Quantity": 0
  }, 
  "HttpVersion": "http2", 
  "Restrictions": {
      "GeoRestriction": {
          "RestrictionType": "none", 
          "Quantity": 0
      }
  }, 
  "Aliases": {
      "Quantity": 0
  }
}

1 个答案:

答案 0 :(得分:0)

您应该使用> (defparameter *small* 1) *SMALL* > (defparameter *big* 100) *BIG* > (defun guess-my-number () (ash (+ *small* *big*) -1)) GUESS-MY-NUMBER > (guess-my-number) 50 进行替换,然后将值重新注入JSON。

sed

输出 echo $TARGET_ID | sed 's/stag4/stag5/g'

接下来,我们将值放回原始JSON,从技术上讲,这将输出新的JSON并且不会编辑文件,但是,您可以通过临时保存到tmp文件来轻松解决此问题。 / p>

我们将使用--arg标志引用我们的bash变量并为我们的字段设置新值

S3-Website-stag5.example.io.s3-website.us-east-2.amazonaws.com