jq双反斜杠有时已删除

时间:2018-11-22 16:01:35

标签: json string jq backslash

我有一个像这样的第一个json文件:

# ASSIGN NEW COLS TO SPLIT chronology
df <- within(df, { 
              chronology <- as.character(chronology)
              start_chronology <- as.numeric(sapply(strsplit(chronology, '-'), `[`, 1))
              stop_chronology <- as.numeric(sapply(strsplit(chronology, '-'), `[`, 2))
              date_id <- NULL
              chronology <- NULL
      })
df
#   feature_id object_type_id amount start_chronology stop_chronology
# 1        156             46      3             2300            2200
# 2        156             46      3             2200            2100
# 3        156             46      3             2100            2000
# 4        274             37      1             2200            2100
# 5        274             37      1             2100            2000

# AGGREGATE TWO COLS ALONG TWO FCTS
agg_df <- do.call(data.frame,
                  aggregate(cbind(start_chronology, stop_chronology) ~ feature_id + object_type_id + amount, df, 
                            function(x) c(min=min(x), max=max(x)))
                  )

# REMOVE COLS AND RENAME COLS
agg_df <- setNames(transform(agg_df, start_chronology.min = NULL, stop_chronology.max=NULL), names(df))
agg_df

#   feature_id object_type_id amount start_chronology stop_chronology
# 1        274             37      1             2200            2000
# 2        156             46      3             2300            2000

如果我使用命令:

{
  "env_vars": {
    "TERRAFORM_CFG_TLS_CERT": "-----BEGIN CERTIFICATE----\\nMIIIqzCCB5O"
  }
}

结果与预期的一样(反斜杠仍然存在):

echo <file> | jq -r '.env_vars'

但是如果我执行此命令:

{
  "TERRAFORM_CFG_TLS_CERT": "-----BEGIN CERTIFICATE----\\nMIIIqzCCB5O"
}

结果是:

cat <file> | jq -r '.env_vars' | jq -r 'keys[] as $k | "\($k)=\"\(.[$k])\""'

=>一个反斜杠已被删除...为什么? 如何避免这种情况?

谢谢。

2 个答案:

答案 0 :(得分:0)

使用-r选项,让jq通过解释JSON专用字符来将JSON字符串“转换”为“原始”字符串(例如,参见http://json.org)。因此,按照[mcve]的指导原则,我们可以开始:

$ jq . <<< '"X\\nY"'
"X\\nY"

$ jq -r . <<< '"X\\nY"'
X\nY

如果检查字符串的json.org规范,您会发现这是完全正确的。

因此,如果出于某种原因您希望用两个反斜杠字符(即JSON:\\)将JSON字符串中每次出现的"\\\\"替换为两个字符,则可以使用sub或{ {1}}。这有点棘手,因为这些函数的第一个参数是正则表达式。看哪:

gsub

答案 1 :(得分:0)

您应该将字符串输出为json以保留转义符。通过获取一个字符串并将其输出为原始字符串,您将确切地知道该字符串是什么,即一个文字反斜杠后跟一个n

$ ... | jq -r '.env_vars | to_entries[] | "\(.key): \(.value | tojson)"'

如果任何值不是字符串,请向过滤器中添加tostring