我有一个像这样的第一个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])\""'
=>一个反斜杠已被删除...为什么? 如何避免这种情况?
谢谢。
答案 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
。