【问题标题】:jq to convert two text strings into a single json objectjq 将两个文本字符串转换为单个 json 对象
【发布时间】:2017-05-17 03:04:32
【问题描述】:

如何将这两个文本字符串转换为单个 json 对象

文本字符串:

start process: Mon May 15 03:14:09 UTC 2017
logfilename: log_download_2017

Json 输出:

{
"start process": "Mon May 15 03:14:09 UTC 2017",
"logfilename": "log_download_2017",
}

Shell 脚本:

logfilename="log_download_2017"
echo "start process: $(date -u)" | tee -a $logfilename.txt | jq -R . >> $logfilename.json
echo "logfilename:" $logfilename | tee -a $logfilename.txt | jq -R . >> $logfilename.json

【问题讨论】:

  • 坦率地说,我猜这就是你在另一个问题中真正想要的,尽管 as ask 它明确希望每个 (key, value) 对位于单独的地图。

标签: json bash sh text-processing jq


【解决方案1】:

如前所述,例如在Use jq to turn x=y pairs into key/value pairs,转换key:value 字符串的基本任务可以通过多种方式完成。例如,您可以从:

index(":") as $ix | {(.[:$ix]) : .[$ix+1:]}

您显然想要修剪一些空格,这可以使用sub/2 来完成。

要组合对象,您可以使用add。要一次性完成此操作,您可以使用 jq -R -s

综合起来,你可以做得比:

def trim: sub("^ +";"") | sub(" +$";"");

def s2o:
  (index(":") // empty) as $ix
  | {(.[:$ix]): (.[$ix+1:]|trim)};

split("\n") | map(s2o) | add

【讨论】:

  • 再次感谢您,优雅的代码和简单的解释。它工作得很好,正如昨天所建议的那样,当通过一种方法来实现时,比如使用 exec 管道所有输入命令。我现在必须将它与昨天的字符串文本处理解决方案结合到一个数组中并构建一个单一的 json 对象。我将再次尝试在开始时实现一个 exec 处理部分,在最后实现另一个。它有两个部分;结合 jq 程序和每个 jq 程序的 exec 管道处理。将这些作为单独的问题提出是否明智?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2019-08-27
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多