使用Sed处理文本文件:仅保留time行的第二个冒号
解决Bash脚本中Time字段格式问题的方案
修改后的完整脚本
#!/bin/bash # 上传文件脚本 # 删除当前文件(-f参数避免文件不存在时报错) rm -f /home/pi/allsky/realtimegauges.txt # 从网络获取气象文本文件 wget https://www.melvinweather.com/realtimegauges.txt # 修改文本文件权限 chmod 777 realtimegauges.txt # 移除{符号 sed -i 's/{//g' realtimegauges.txt # 将date替换为time sed -i 's/date/time/g' realtimegauges.txt # 移除"符号(若实际文件是普通双引号,可改为`s/"//g`) sed -i 's/"//g' realtimegauges.txt # 处理冒号:time行仅替换第一个冒号为等号,其他行替换所有冒号为等号 sed -i '/time/ s/:/=/; !s/:/=/g' realtimegauges.txt # 移除末尾的, sed -i 's/,//g' realtimegauges.txt # 复制文件到指定目录 cp realtimegauges.txt /home/pi/allsky/tmp/extra
关键修改说明
原脚本中sed -i 's/:/=/g'会替换所有冒号为等号,导致time字段变成time=xx=xx的错误格式。我们通过sed的分支匹配功能修正:
/time/ s/:/=/:匹配包含time的行,仅替换第一个冒号为等号,保留时间里的第二个冒号!s/:/=/g:对不包含time的行,替换所有冒号为等号,保证其他字段格式正确
可选的精准处理方案(针对标准JSON键值对)
如果气象文件每行都是严格的"key":"value",格式,也可以用更精准的匹配替换,避免意外修改:
# 替换date为time并直接格式化time行 sed -i 's/"date":"\([0-9]*:[0-9]*\)"/time=\1/' realtimegauges.txt # 格式化其他所有键值对 sed -i 's/"\([^"]*\)":"\([^"]*\)"/\1=\2/' realtimegauges.txt # 移除{符号和末尾逗号 sed -i 's/{//g; s/,//g' realtimegauges.txt
这种方式直接针对JSON键值对结构处理,不需要单独处理引号和冒号的顺序,容错性更强。
内容的提问来源于stack exchange,提问作者BobW
相关产品推荐
相关产品推荐

