如何用Bash的sed结合date命令将JSON日期转为时间戳?
解决Sed替换ISO日期为时间戳时所有结果相同的问题
你遇到的问题核心是Bash命令替换的执行时机:你写的$(date --date=\1 +'%s')会在sed开始处理文本之前就被Bash执行完毕——此时sed还没捕获到任何日期字符串,\1对Bash来说就是普通字符串,date命令处理这个无效输入会返回一个固定的错误时间戳,所以所有替换结果全是同一个值。
下面给你两种可行的解决方案:
方案1:用GNU Sed的e标志执行命令
GNU Sed支持e替换标志,能让替换后的内容作为Shell命令执行,再用执行结果替换原匹配内容。命令调整如下:
echo "$data" | sed -E 's/"([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(.[0-9]*Z)?)"/echo "$(date --date=\1 +%s)"/ge'
-E:启用扩展正则表达式,不用手动转义括号g:全局替换所有匹配的日期e:把替换后的echo "$(date --date=\1 +%s)"作为Shell命令执行,用date的输出替换原日期字符串
方案2:用JQ处理(更适合JSON数据)
既然是处理JSON格式的OHLC数据,用专门的JSON工具jq会更可靠,避免正则处理JSON的潜在问题。假设你的数据是数组结构,命令如下:
echo "$data" | jq '.[] |= (.t |= (strptime("%Y-%m-%dT%H:%M:%SZ") | mktime))'
- 如果你的日期字符串不带末尾的
Z,把格式字符串改成"%Y-%m-%dT%H:%M:%S"即可 .[]:遍历数组中的每一条OHLC记录.t |= ...:把t字段的值替换为解析后的时间戳
内容的提问来源于stack exchange,提问作者MPoorzahed
相关产品推荐
相关产品推荐

