0

我有一个文件,其数据类似于以下内容:

>       <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,提取纪元时间戳并将其传递给我的转换命令。

任何帮助表示赞赏。

4

3 回答 3

2

这样的事情应该做:

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

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

于 2013-05-14T17:27:12.123 回答
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
于 2013-05-14T15:36:15.337 回答
0
perl -MTime::Piece -pe 's/fileModTime="\K\d+/ (localtime $&)->cdate /e' file

如果Wed Jan 16 10:15:04 2013格式不适合您,请替换cdatestrftime("your format here")

如果您对此感到满意,请在-i之前添加-pe以就地编辑文件。

于 2013-05-14T21:49:59.757 回答