我一直在search,并没有成功与此任务..
我有一些GPS数据文件的多个date以秒为单位显示为Unix纪元时间,我需要转换这些,以便我可以将文件数据插入到电子表格中。
date可以转换它们,例如
$ date -d @1441202338 +'%d-%m-%y %H:%M:%s' 02-09-15 21:58:58
unixdate是用引号括起来的十位数字,还有其他更长的数字,如经度和纬度,所以只需要replace我需要find正好十位数的引号。
复制一个字段XML内的数据
如何用cmd.exe中的百分号字符replace?
sed正在打印一个被replace的行两次
防止sed扩展variables
sedreplace字符后的所有事件
我已经开始build立一个sed命令,但我找不到如何search引号中的string,然后只发送string到date
sed "s/([0-9]{10})/$(date -d @1 +'%d-%m-%y %H:%M:%s')/g" file
会把<"放在那里表示一个报价在开始?
我也不确定date能理解1
有人可以指导我解决问题吗?
编辑:
下面是我试图转换的文件中的示例行:
type="waypoint" latitude="22.2091608952380115" longitude="44.65250015586757" name="name" altitude="309.18737800000002" unixtime="1441202338"
其中unixtime="1441202338"必须更改为unixtime="02-09-15 21:58:58" 。
(很明显,这个date不会再是“unixtime”,但是这个标签可以在之后改变)
EDIT2:
最小的文件示例:
'#VIKING GPS Data file http://viking.sf.net/ FILE_VERSION=1 xmpp=4.000000 ympp=4.000000 lat=40.714490 lon=-74.007130 mode=mercator color=#cccccc highlightcolor=#eea500 drawscale=t drawcentermark=t drawhighlight=t ~Layer TrackWaypoint name=name tracks_visible=t waypoints_visible=t routes_visible=t trackdrawlabels=t trackfontsize=3 drawmode=0 trackcolor=#000000 drawlines=t line_thickness=1 drawdirections=f trkdirectionsize=5 drawpoints=t trkpointsize=2 drawelevation=f elevation_factor=30 drawstops=f stop_length=60 bg_line_thickness=0 trackbgcolor=#ffffff speed_factor=30.000000 tracksortorder=0 drawlabels=t wpfontsize=3 wpcolor=#000000 wptextcolor=#ffffff wpbgcolor=#8383c4 wpbgand=f wpsymbol=0 wpsize=4 wpsyms=t wpsortorder=1 drawimages=t image_size=64 image_alpha=255 image_cache_size=300 Metadatadesc= Metadataauthor= Metadatatime=2015-10-03T08:11:32.776627Z Metadatakeywords= ~LayerData type="waypointlist" type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="1441202338" symbol="navaid,Amber" type="waypointlistend" ~EndLayerData ~EndLayer'
记事本++replace文本获取一些文本
Windows上的命令行search和replace工具的build议
在csv中replace错误的行
Linux删除一行中的字符后的空格
如何使用sedreplace带有反斜杠的string模式
使用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"
gawk '/unixtime=/{$12=strftime("%d-%m-%y %H:%M:%s",$12)}1' FS=" OFS=" inputfile > targetfile
结果
... ... ... ~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支持就地更换,请检查: https : //www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html
如果GNU sed可用,请查看其替代命令的e标志:
这个命令允许将命令从shell命令输入到模式空间。 如果进行替换,则会执行在模式空间中找到的命令,并将模式空间替换为其输出。
这里是我的例子(最难的部分是正确的引用引号):
$ sed -r -e 's/unixtime="([0-9]+)".*/date -d @1 "+unixtime=\"%d-%m-%y %H:%M:%s\""/ge' <<<'type="waypoint" latitude="22.2091608952380115" longitude="44.65250015586757" name="name" altitude="309.18737800000002" unixtime="1441202338" symbol="navaid,Amber"' unixtime="02-09-15 14:58:58"
请注意, /e会导致命令替换替换整个模式空间,所以您可能需要使用保留空间来保留替换之前和之后的文本。 这是读者的一个练习。
Perl解决方案,基于我的GNU sed答案:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。