2013-05-14 55 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編輯就地文件。

相關問題