如何在Linux中将日期YYYYMMDDHHmm转换为YYYY / MM / DD HH:mm格式

时间:2016-08-12 18:59:04

标签: xml awk

我在

下面有xml文件
<?xml version="1.0" encoding="UTF-8"?>
<programme start="20160813000000" stop="20160813003000">
   <category lang="en">News</category>
 </programme>
 <programme start="20160813003000" stop="20160813010000">
   <category lang="en">TV Show</category>
 </programme>
 <programme start="20160813010000" stop="20160813060000">
   <category lang="en">Sports</category>
 </programme>
 </xml>

如何使用linux批处理文件将开始和停止日期时间格式转换为YYYY / MM / DD HH:mm?

3 个答案:

答案 0 :(得分:1)

这真的是sed而不是awk的工作,因为sed是单个行上简单替换的最佳工具(awk用于其他所有内容):

$ sed -E 's,((start|stop)="....)(..)(..)(..)(..)..",\1/\3/\4 \5:\6",g' file
<?xml version="1.0" encoding="UTF-8"?>
<programme start="2016/08/13 00:00" stop="2016/08/13 00:30">
   <category lang="en">News</category>
 </programme>
 <programme start="2016/08/13 00:30" stop="2016/08/13 01:00">
   <category lang="en">TV Show</category>
 </programme>
 <programme start="2016/08/13 01:00" stop="2016/08/13 06:00">
   <category lang="en">Sports</category>
 </programme>
 </xml>

如果你想保持秒数,那么显然只需将它们包含在捕获组中即可:

$ sed -E 's,((start|stop)="....)(..)(..)(..)(..)(.."),\1/\3/\4 \5:\6:\7,g' file
<?xml version="1.0" encoding="UTF-8"?>
<programme start="2016/08/13 00:00:00" stop="2016/08/13 00:30:00">
   <category lang="en">News</category>
 </programme>
 <programme start="2016/08/13 00:30:00" stop="2016/08/13 01:00:00">
   <category lang="en">TV Show</category>
 </programme>
 <programme start="2016/08/13 01:00:00" stop="2016/08/13 06:00:00">
   <category lang="en">Sports</category>
 </programme>
 </xml>

答案 1 :(得分:1)

sed可用于进行文本转换。

您可以使用:

sed 's@\(start="\|stop="\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)@\1\2/\3/\4 \5:\6:\7@g' filename 

以上命令很难阅读和维护。但是,如果使用扩展的正则表达式选项-r,则可以避免上述命令中的许多反斜杠。

sed -r 's@(start="|stop=")([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})@\1\2/\3/\4 \5:\6:\7@g' filename

上述命令都只会在不更改原始文件的情况下打印输出,因此如果需要,您可能需要将输出重定向到新文件。

但是,如果要修改orriginal文件本身,则需要使用-i选项,如:

sed -i 'command' filename

最后,如果你想在修改之前创建origianl文件的备份 - 以防万一 - 你可以这样做:

sed -i.bak 'command' filename   

答案 2 :(得分:0)

使用&#34; date -j -f&#34;命令。例如:

date -j -f "%Y%m%d" "27 JUN 2011" +%Y/%m/%d