vim 搜索纪元时间字符串,管道到日期 -d 并将日期返回到文件中

use*_*166 1 linux vim shell sed

我有一个包含大量数据的文件,其中一个是 last-modified="1231231231"

其中 1231231231 是以毫秒为单位的纪元时间

<Translation 
  author_id="25" 
  id="02f18edd-ef7a-48e2-b614-b5888936017e"
  language="de_DE" 
  last_modified="1325669156960" 
  phase="1" 
  target="[ phase=&quot;1&quot; language=&quot;de_DE&quot; ]"
  translation_text="Funktionen"/>
Run Code Online (Sandbox Code Playgroud)

注意:last_modified="1325669156960"

我可以运行这个:

:%s/\([0-9]\{10\}\)\([0-9]\{3\}\)/\1/g  
Run Code Online (Sandbox Code Playgroud)

找到所有这些事件并用“秒”字符串替换它们:

last_modified="1325669156"

然后我可以对这 10 个数字进行模式匹配,我想做的是将它们通过管道传输到 unix data -d 命令以返回格式化的数据戳:

:%s/[0-9]\{10\}/&/g 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,不是用我找到的相同的值(即&)替换,

我想以某种方式将该值传递给本质上:

date -d &
Run Code Online (Sandbox Code Playgroud)

并将其作为格式化的时间戳返回

last_modified="Wed Jan  4 07:13:32 MST 2012"
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?我必须每隔一周对各种文件执行此操作。

kev*_*kev 5

你可以strftime()在vim中使用。找到一种合适的格式字符串来满足您的需求。
我在%c这里使用:

:%s/last_modified="\zs\(\d\{10}\)\d\{3}/\=strftime('%c', str2nr(submatch(1)))/g
Run Code Online (Sandbox Code Playgroud)

结果:

<Translation 
  author_id="25" 
  id="02f18edd-ef7a-48e2-b614-b5888936017e"
  language="de_DE" 
  last_modified="2012-1-4 17:25:56" 
  phase="1" 
  target="[ phase=&quot;1&quot; language=&quot;de_DE&quot; ]"
  translation_text="Funktionen"/>
Run Code Online (Sandbox Code Playgroud)