用于替换文件中的多个unix时间戳实例的Shell脚本

时间:2013-05-14 15:28:11

标签: bash shell scripting

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

>       <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时间戳,并用可读的日期和时间戳替换那里的值。

我知道更改日期的命令。我不知道该怎么做才是实际的文件翻页,提取纪元时间戳并将其传递给我的转换命令。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

这样的事情应该做:

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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