Json 用jq替换字符串
我有以下文件Json 用jq替换字符串,json,datetime,jq,Json,Datetime,Jq,我有以下文件file.txt: {"a": "a", "b": "a", "time": "20210210T10:10:00"} {"a": "b", "b": "b", "time": "20210210T11:10:00"} 我使用bash命令jq提取
file.txt
:
{"a": "a", "b": "a", "time": "20210210T10:10:00"}
{"a": "b", "b": "b", "time": "20210210T11:10:00"}
我使用bash
命令jq
提取值(我对大量100g文件使用此命令):
这将返回以下良好结果:
a a 20210210T10:10:00
b b 20210210T11:10:00
我想要的输出是:
a a 2021-02-10 10:10:00
b b 2021-02-10 11:10:00
问题是我想以最有效的方式更改日期的格式。
我该怎么做呢?您可以在sed中完成,但也可以在
jq
中直接调用sub
:
jq -r '[.a, .b,
( .time
| sub("(?<y>\\d{4})(?<m>\\d{2})(?<d>\\d{2})T";
.y+"-"+.m+"-"+.d+" ")
)
] | @tsv'
jq-r'[.a,.b,
(.时间
|sub((?\\d{4})(?\\d{2})(?\\d{2})T);
.y+“-”+.m+“-”+.d+”)
)
]|@tsv'
您可以在sed中执行,但也可以在jq
中直接调用sub
:
jq -r '[.a, .b,
( .time
| sub("(?<y>\\d{4})(?<m>\\d{2})(?<d>\\d{2})T";
.y+"-"+.m+"-"+.d+" ")
)
] | @tsv'
jq-r'[.a,.b,
(.时间
|sub((?\\d{4})(?\\d{2})(?\\d{2})T);
.y+“-”+.m+“-”+.d+”)
)
]|@tsv'
使用sed:
$echo“20210427T19:23:00”| sed-r的|([:digit:]{4})([[:digit:]{2})([[:digit:]]
{2} )T |\1-\2-\3 |'
2021-04-27 19:23:00
使用sed:
$echo“20210427T19:23:00”| sed-r的|([:digit:]{4})([[:digit:]{2})([[:digit:]]
{2} )T |\1-\2-\3 |'
2021-04-27 19:23:00
使用strtime
进行日期解释,使用strftime
进行格式设置:
parse.jq
按如下方式运行:
<input.json jq -rf parse.jq
使用
strtime
进行日期解释,使用strftime
进行格式设置:
parse.jq
按如下方式运行:
<input.json jq -rf parse.jq
由于速度是一个问题,而且似乎不需要比字符串拆分更多的东西,所以可以使用
[.a, .b,
(.time | "\(.[:4])-\(.[4:6])-\(.[6:8]) \(.[9:])"]
与使用
jq
和awk-F\\t'BEGIN{OFS=FS}..
(awk
便于处理TSV)进行类似的拆分相比,由于速度是一个问题,而且似乎不需要比字符串拆分更多的东西,因此可以使用
[.a, .b,
(.time | "\(.[:4])-\(.[4:6])-\(.[6:8]) \(.[9:])"]
与使用
jq
和awk-F\\t'BEGIN{OFS=FS}进行类似拆分相比,
(awk
,以便于处理TSV)。用替换(\d{4})(\d{2})(\d{2})t
和\1-\2-\3
(包括最终空格)?类似于echo“20210427T19:23:00”| sed的/(\d{4})(\d{2})(\d{2})T/\1-\2-\3/g'
?这个命令失败了,所以我很想得到它的工作版本:)如果我没记错的话,使用sed你必须使用[0-9]
而不是\d
,获得替换's/\([0-9]\{4\\\\)\([0-9]\{2\\\)\([0-9]\{2\\)T/\1-\2-\3/g'
用替换(\d{4}\d{2}\d}2}\code><1-\T(包括最后一个空格)?你的意思是使用sed
?类似echo“20210427T19:23:00”| sed/(\d{4})(\d{2})(\d{2})T/\1-\2-\3/g'
?这个命令失败,所以我很想得到它的工作版本:)如果我没有记错,使用sed你必须使用[0-9]
,而不是\d
,获得替换的's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\})T/\1-\2-\3/g'
将此项标记为sed
比@choroba solution快25%。感谢您将此项标记为sed,比@choroba solution快25%。谢谢两位