2013-05-14 70 views
0

我有一个具有类似于下面的数据文件:Shell脚本来取代UNIX时间戳的多个实例在一个文件

>  <Element  
>  Stream="12" 
>  Target_trans="133106" 
>  Trans="48467" 
>  fileModTime="1358349304" 
>  Type="1" 
>  EOL="0" 
>  user_id="33" /> <Element  
>  Stream="14" 
>  Target_trans="133106" 
>  Trans="48467" 
>  fileModTime="1358539304" 
>  Type="1" 
>  EOL="0" 
>  user_id="33" /> <Element  
>  Stream="11" 
>  Target_trans="133113" 
>  Trans="48467" 
>  fileModTime="1158539204" 
>  Type="1" 
>  EOL="0" 
>  user_id="33" /> <Element  
>  Stream="11" 
>  Target_trans="133106" 
>  Trans="48467" 
>  fileModTime="1358129304" 
>  Type="1" 
>  EOL="0" 
>  user_id="33" /> 

我需要通过这个文件,找到fileModTime的所有实例这是一个unix时间戳,并用可读的日期和时间戳替换那里的值。

我知道命令来更改日期。什么我不知道该怎么做是通过文件的实际grepping,提取时代的时间戳,并将其传递到我的转换命令。

任何帮助表示赞赏。

回答

2

像这样的东西应该做的:

awk '/fileModTime/{ 
    split($0, a, "=") 
    gsub(/"/, "", a[2]) 
    sub(/[0-9]+/, strftime("%F %T", a[2]), $0) 
}1' input.xml 

但是,一般来说,逐行处理XML数据并不是一个好主意。使用实际的XML解析器可能会更好。

+0

+1,用于提议使用xml解析器 – Bill 2013-05-14 20:34:19

0

您可以使用下面的sed命令:

sed -i.bak 's/\(fileModTime=\)"\(.*\?\)"/\1"'"$(date -d @\2)"'"/' inFile 

编辑:

用awk更好:

awk -F'"' '{if ($1 ~ /fileModTime=/) {printf("%s", $1); system("date -d @" $2)} 
      else print}' file 
+0

这一个更改所有fileModTimes是完全相同的... – user327697 2013-05-14 15:47:46

+0

请检查编辑。 – anubhava 2013-05-14 18:27:57

0
perl -MTime::Piece -pe 's/fileModTime="\K\d+/ (localtime $&)->cdate /e' file 

如果Wed Jan 16 10:15:04 2013格式不为你工作,与strftime("your format here")

取代cdate如果你满意这个作品,-pe前添加-i编辑就地文件。

相关问题