使用bash而不是JQ转换为小写json键

使用bash而不是JQ转换为小写json键,json,bash,dictionary,Json,Bash,Dictionary,我有一个json,它是一个带有下一个语法的字典列表: [ { "Date_and_Time": "Dec 29, 2017 15:35:37", "Componente": "Bar", "IP_Origen": "175.11.13.6", "IP_Destino": "81.18.119.864&q

我有一个json,它是一个带有下一个语法的字典列表:

 [ 
     {
    "Date_and_Time": "Dec 29, 2017 15:35:37",
    "Componente": "Bar",
    "IP_Origen": "175.11.13.6",
    "IP_Destino": "81.18.119.864",
    "Country": "Brazil",
    "Age": "3"

},

{

    "Date_and_Time": "Dec 31, 2017 17:35:37",
    "Componente": "Foo",
    "IP_Origen": "176.11.13.6",
    "IP_Destino": "80.18.119.864",
    "Country": "France",
     'Id': '123456',
     'Car': 'Ferrari'

},
{
  "Date_and_Time": "Dec 31, 2017 17:35:37",
    "Age": "1",
    "Country": "France",
     'Id': '123456',
     'Car': 'Ferrari'
},
{
    "Date_and_Time": "Mar 31, 2018 14:35:37",
    "Componente": "Foo",
    "Country": "Germany",
     'Id': '2468',
     'Genre': 'Male'

}
]

json非常大,每个字典都有不同数量的键/值字段。我想做的是把键的每个字符改写成小写。预期投入:

[ 
     {
    "date_and_time": "Dec 29, 2017 15:35:37",
    "componente": "Bar",
    "ip_origen": "175.11.13.6",
    "ip_destino": "81.18.119.864",
    "country": "Brazil",
     .
     .
     .
 

使用以下Perl一行程序:

perl -lne '@F = split /:/, $_, 2; $F[0] = lc $F[0]; print join ":", @F;' in.json > out.json
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-n
:一次循环输入一行,默认情况下将其分配给
$。
-l
:在行内执行代码之前,请先去掉输入行分隔符(
“\n”
,默认情况下在*NIX上),然后在打印时附加它

@F=split/:/,$2:将输入字符串
$\uu
拆分为最多2个元素的数组
@F

awk 'NF>1{$1=tolower($1)} 1' FS=: OFS=: file
GNU sed:

sed 's/[^:]*:/\L&/' file

将每行
字符前的所有内容转换为小写。要使其正常工作,每个键/val对必须占用一行,并且键不能包含
字符。在awk中,可以通过在
处拆分来完成,以便可以转换第一个字段。在perl中,替换运算符用于替换第一个
之前的所有内容,其本身由
\L
转义(在
man 1 perlop
中的信息)小写。GNU sed提供了类似perl的
\L
序列(仅在sed中的
s///
的替换部分中可用)。

尽管我对您的问题发表了评论,但bash:

#分配给“key”变量的字符串将采用小写
声明-l密钥
而IFS=:read-r键值;做
[[-z$value]]&&echo“$key”| | echo“$key:$value”
done
输出

[
{
“日期和时间”:“2017年12月29日15:35:37”,
“组件”:“棒”,
“ip_origen”:“175.11.13.6”,
...
我不再费力地解释每一行,而是提供一些到文档的链接,以供自学:

  • 这里是stackoverflow
  • bash常见问题解答#001:
  • &&
    |
    记录在手册中的

仅使用双引号括起来的键?还是您还希望对单引号括起来的键应用“lower()”逻辑?(例如,
'Id':'2468',
==>
'Id':'2468'
);什么(code)到目前为止你都试过了吗?都试过了。我的想法是实现一个sed命令,将每个字符都改成小写,但它根本没有效率,而且还会改变值(我只想改变键)你能解释一下吗?@oguzismailI不是在寻找JQ解决方案,我想在Bash中实现一个JSON解析器来解析JSON。对于XML、HTML、CSV……也有同样的建议。这很好,但当我有时间使用“:”语法时,它被修改了,请查看更新的答案。令人惊讶的是,最后一件事是,每次它都会被放入我的JSON中遇到下一个语法“['']'{'}”。有什么办法可以避免吗?@Kiko也解决了这个问题,请查看更新的答案。你能解释一下吗?有什么特别的事情需要澄清吗?或者整个答案?如果可能的话,整个答案你能解释一下吗?@Kiko我添加了一些单词。
sed 's/[^:]*:/\L&/' file