Linux 如何转换文件中的所有unix日期?

Linux 如何转换文件中的所有unix日期?,linux,replace,sed,Linux,Replace,Sed,我一直在到处寻找,但这项任务还没有成功 我有一些gps数据文件,其中多个日期以秒表示为Unix历元时间,我需要转换这些数据,以便将文件数据插入电子表格 date可以转换它们,例如 $ date -d @1441202338 +'%d-%m-%y %H:%M:%S' 02-09-15 21:58:58 unix日期是用引号括起来的十位数字,还有其他更长的数字,如经度和纬度,因此,要仅替换日期,我需要在引号中精确找到十位数字 我已经开始构建一个sed命令,但我不知道如何在引号中搜索字符串,然后只将

我一直在到处寻找,但这项任务还没有成功

我有一些gps数据文件,其中多个日期以秒表示为Unix历元时间,我需要转换这些数据,以便将文件数据插入电子表格

date
可以转换它们,例如

$ date -d @1441202338 +'%d-%m-%y %H:%M:%S'
02-09-15 21:58:58
unix日期是用引号括起来的十位数字,还有其他更长的数字,如经度和纬度,因此,要仅替换日期,我需要在引号中精确找到十位数字

我已经开始构建一个sed命令,但我不知道如何在引号中搜索字符串,然后只将该字符串发送到
date

sed "s/\([0-9]{10}\)/$(date -d @\1 +'%d-%m-%y %H:%M:%S')/g" file
将使用
gawk
时间函数放置
\

示例

echo 'altitude="309.18737800000002" unixtime="1441202338"'|\
   gawk '$(NF-1)=strftime("%d-%m-%y %H:%M:%S",$(NF-1))' FS=\" OFS=\"
结果

altitude="309.18737800000002" unixtime="02-09-15 15:58:58"
...
...
...
~LayerData
type="waypointlist"
type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 15:58:58" comment="29-08-11 8:27:49" symbol="navaid, amber"
type="waypointlistend"

~EndLayerData
~EndLayer
完成文件 要过滤输入文件,请使用:

gawk '/unixtime=/{$12=strftime("%d-%m-%y %H:%M:%S",$12)}1' FS=\" OFS=\" inputfile > targetfile
结果

altitude="309.18737800000002" unixtime="02-09-15 15:58:58"
...
...
...
~LayerData
type="waypointlist"
type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 15:58:58" comment="29-08-11 8:27:49" symbol="navaid, amber"
type="waypointlistend"

~EndLayerData
~EndLayer

如果您的
gawk
支持就地更换,请检查:

如果GNU sed可用,请查看其
e
标志以替换命令:

此命令允许将shell命令中的输入导入 模式空间。如果进行了替换,则 执行模式空间中的查找,并替换模式空间 用它的输出

下面是我的例子(困难的部分是正确地引用引号):

$sed-r-e's/unixtime=“([0-9]+)”*/date-d@\1\“+unixtime=\\\%d-%m-%y%H:%m:%s\\\\“\/ge”\

基于我的GNU-sed答案的Perl解决方案:

perl -pe 's/unixtime="([0-9]+)"/`date -d \@$1 \"+unixtime=\\"%d-%m-%y %H:%M:%S\\"\"`/ge&&s/\n//'
对Perl语法的小修改;另外,Perl不会从
date
的输出中删除换行符,因此有一个额外的命令。我在您的示例文件中测试了它,相关部分变成

~LayerData
type="waypointlist"
type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 14:58:58" symbol="navaid, amber"
type="waypointlistend"
~EndLayerData

您的问题没有正确标记。这是一个关于linux的问题,实际上可能更适合linux/unix stack exchange站点。将示例文件与所需的输出一起显示可能会更好。@scottb,对不起,是否可以迁移到stack exchange?@fedorqui,我用示例文件内容和我的目标编辑了。谢谢您的帮助,klashxx,gawk看起来不错。。我如何在文件上执行这个gawk命令?我在一个文件上尝试了更新的命令,但是unixtime值没有受到影响,正如您在我发布的示例中看到的那样,非常奇怪。您是否尝试了我的第一个示例(使用
echo
)?它有效!我复制了你的呆板,一个有
NF-1。。。文件>文件
,在一个更大的文件上运行,效果很好,真是一个帮助!谢谢你,伙计!这是可行的,但在一个文件上它会断掉行,每个带有
unixtime=“…”
字符串的行都会从文件中删除,并且
date
的错误消息会抱怨
symbol=“…”
字段似乎不符合逻辑(
date:extra-operand'symbol=navaid,amber'
)@mozerlla,我已经解决了这个问题,
s///e
似乎还将行中不匹配的剩余部分传递给shell命令。这真的不是直观的,是吗?我认为Perl可能是更好的选择。它也有一个
/e
操作符,但它的工作方式更像人们所期望的那样。
~LayerData
type="waypointlist"
type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 14:58:58" symbol="navaid, amber"
type="waypointlistend"
~EndLayerData