使用Bash脚本修改XML文件中的指定时间格式
没问题,我帮你搞定这个Bash脚本修改XML时间格式的需求~
解决方案:用sed精准替换XML属性中的时间格式
我们可以借助sed命令来实现精准匹配和替换,它能只修改time="HH:MM:SS"格式的XML属性内容,不会干扰文件里其他无关的时间戳。
核心命令
先看直接可用的命令,假设你的源文件是input.xml,处理后输出到output.xml:
sed -E 's/time="([0-9]{2}):([0-9]{2}):[0-9]{2}"/time="\1-\2"/; s/time="0([0-9]):/\1-/' input.xml > output.xml
命令拆解说明
我把这条命令拆成两部分,方便你理解:
第一步:去掉秒数,替换时间分隔符
s/time="([0-9]{2}):([0-9]{2}):[0-9]{2}"/time="\1-\2"/这部分会匹配
time="开头,接着两位小时、冒号、两位分钟、冒号、两位秒数的格式,把小时和分钟用分组捕获(\1对应小时,\2对应分钟),然后替换成time="小时-分钟",直接去掉了秒数部分。第二步:移除小时的前导零
s/time="0([0-9]):/\1-/'这部分专门处理开头带
0的小时(比如08),把前导零去掉,变成单个数字的小时格式,最终就得到你要的8-05样式。
直接修改原文件(可选)
如果你想直接修改源文件(记得先备份!),可以加-i参数(GNU sed适用):
sed -i -E 's/time="([0-9]{2}):([0-9]{2}):[0-9]{2}"/time="\1-\2"/; s/time="0([0-9]):/\1-/' input.xml
要是你用的是macOS的BSD sed,-i需要加个空参数:
sed -i '' -E 's/time="([0-9]{2}):([0-9]{2}):[0-9]{2}"/time="\1-\2"/; s/time="0([0-9]):/\1-/' input.xml
效果验证
比如原文件里的内容:
<event time="08:05:00" description="早上会议" otherTime="14:30:00" /> <note>上次更新时间12:00:00</note>
执行命令后会变成:
<event time="8-05" description="早上会议" otherTime="14:30:00" /> <note>上次更新时间12:00:00</note>
可以看到只有time属性里的时间被修改,其他位置的时间完全不受影响~
内容的提问来源于stack exchange,提问作者Michael Oddie
相关产品推荐
相关产品推荐

