2016-09-03 270 views
1

我试图卷曲网页,并做了一些处理,并在最后我试图以JSON格式打印。(这实际上需要在MongoDB中输入)bash脚本打印输出

所以输入(这是读尽管卷曲)是

输入:

brendan google engineer 
stones microsoft chief_engineer 
david facebook tester 

的那种处理的,我的变量($名称,$ emloyer,$名称)分配值

我的最后命令,该命令转换成JSON是,

echo [{\"Name\":\"$name\"},{\"Employer\":\"$employer\"},{\"dDesignation\":\"$designation\"}] 

电流输出是,

[{"Name":"brendan","Employer":"google","Designation":"engineer"}] 
[{"Name":"stones","Employer":"microsoft","Designation":"chief_engineer"}] 
[{"Name":"david","Employer":"facebook","Designation":"tester"}] 

但是,我想在同一行中输出由逗号和方括号中分离(不在每行)

预期输出:

[{"Name":"brendan","Employer":"google","Designation":"engineer"},{"Name":"stones","Employer":"microsoft","Designation":"chief_engineer"}, 
    {"Name":"david","Employer":"facebook","Designation":"tester"}] 

有任何建议。

+1

为什么你在意如果你生成JSON是换行符?你应该关心分析树和文档模型是什么样子 - 如果你需要关心元素之间的空白是什么样的,那么你的消费者(解析你生成的代码的人)就是做错了。 –

+0

......特别是,MongoDB *绝对不会在意在语法相关位置(如字符串内容)之外是否有换行符或空格。 –

回答

5

传统的文本处理工具无法为一般情况做到这一点。例如,JSON有很多特殊情况 - 不可打印和高Unicode字符(和引号)需要转义。使用这实际上这项工作建立了一个工具,如jq


jq -n -R ' 
[ 
    inputs | 
    split(" ") | 
    { "Name": .[0], "Employer": .[1], "Designation": .[2] } 
]' <<EOF 
brendan google engineer 
stones microsoft chief_engineer 
david facebook tester 
EOF 

...发射作为输出:

[ 
    { 
    "Name": "brendan", 
    "Employer": "google", 
    "Designation": "engineer" 
    }, 
    { 
    "Name": "stones", 
    "Employer": "microsoft", 
    "Designation": "chief_engineer" 
    }, 
    { 
    "Name": "david", 
    "Employer": "facebook", 
    "Designation": "tester" 
    } 
] 
+0

Perfecto !!如果你有另一个选择,你会建议什么工具? – sjsam

+2

如果安装jq不是一个选项,我平常的回退就是嵌入一段Python代码,因为那里有一个非常出色的json模块。 –

+0

我虽然关于perl,但是现在jq在这些日子里更容易被使用,我想。无论如何,很好的答案++ – sjsam

1

像这样的事情?

sep='[' 
curl "...whatever..." | 
while read -r name employer designation; do 
    printf '%s{"Name": "%s", "Employer": "%s", "Designation": "%s"}' "$sep" "$name" "$employer" "$designation" 
    sep=', ' 
done 
printf ']\n' 

我确实认为这很脆弱且容易出错;如果您可以使用像jq这样的JSON感知工具,那么请务必这样做。

+0

@CharlesDuffy确实,键入,没有想到 - 现在修复,感谢诊断! – tripleee

+0

@tripleee这实际上工作得很好,可以写成mongodb查询吗? 它会像 db.testcollection.insert([{ “名称”: “布兰登”, “雇主”: “谷歌”, “称号”: “工程师”},{ “名称”: “宝石”, “雇主”:“微软”,“指定”:“chief_engineer”}]) – Karthik

+0

不知道你想要去哪里。如果您只是想将它添加到我们打印的文本中,则更改应该很明显。 – tripleee

0

如果您有机会获得JQ 1.5或更高版本,那么你可以使用inputs不妨考虑使用splits(" +")的情况下,令牌可能由一个以上的空格分开:

jq -n -R ' 
    [inputs 
    | [splits(" +")] 
    | { "Name": .[0], "Employer": .[1], "Designation": .[2] }]' 

如果你不这样做已准备好访问jq 1.5或更高版本,那么请注意以下内容将与jq 1.4配合使用:

jq -R -s ' 
    [split("\n")[] 
    | select(length>0) 
    | split(" ") 
    | { "Name": .[0], "Employer": .[1], "Designation": .[2] }]'