如何在sed命令中结合date -d将时间戳转为易读日期格式?
解决shell脚本中时间戳转换与输出排版问题
你的核心问题是sed无法动态处理每行的时间戳——原来的$(date -d)会在脚本加载时就执行,而不是针对每行的时间值做转换。另外需要调整输出格式,把日期和标题合并为一行。
以下是修改后的完整脚本,针对13位毫秒级时间戳(如161145246842)做处理,同时调整输出排版:
function tvpsport(){ wget -qO- 'https://sport.tvp.pl/' | grep -i -B 9 'video_id' | grep 'title\|broadcast_start\|video' | sed -e 's/"//g' \ -e 's/,$//g' \ -e 's/\\u2013/-/g' \ -e 's/\\u0105/ą/g' \ -e 's/\\u0119/ę/g' \ -e 's/\\u0142/ł/g' \ -e 's/\\u00f3/ó/g' \ -e 's/\\u015a/Ś/g' \ -e 's/\\u017a/ź/g' \ -e 's/\\u017c/ż/g' \ -e 's/\\u0144/ń/g' \ -e 's/title : //g' \ -e 's/broadcast_start : //g' \ -e 's/video_id : /https:\/\/tvp.pl\/sess\/TVPlayer2\/embed.php?ID=/g' | awk ' # 存储标题、时间戳、链接 NR==1 { title=$0 } NR==2 { # 13位毫秒时间戳转秒,再格式化为dd/mm/YYYY cmd = "date -d @" substr($0,1,10) "+%d/%m/%Y" cmd | getline date_str close(cmd) } NR==3 { print date_str " " title; print $0 } ' }
关键修改说明:
- sed部分:移除了原来的
broadcast_start替换逻辑,只保留时间戳本身,方便后续处理。 - awk部分:
- 按行号分别存储标题(第1行)、时间戳(第2行)、链接(第3行)。
- 对13位时间戳取前10位(转成秒级Unix时间戳),调用
date命令格式化为dd/mm/YYYY。 - 最后按要求输出:
日期 标题,然后单独一行输出链接。
如果你的时间戳是10位秒级的(比如1611452468),只需把awk里的substr($0,1,10)改成$0即可。
内容的提问来源于stack exchange,提问作者rider
相关产品推荐
相关产品推荐

