使用bash而不是JQ转换为小写json键
我有一个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
[
{
"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