Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 用jq替换字符串_Json_Datetime_Jq - Fatal编程技术网

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%。谢谢两位