嘿,我不会将unix时代改为正常日期
我正在尝试:
sed < file.json -e 's/\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/`date -r \1`/g'
任何提示?
答案 0 :(得分:1)
由于帖子中缺少信息,我无法给出比这更好的答案,但可以使用sed
执行命令!
你有不同的方法可以使用
sed
e
指令后跟命令
执行,如果你没有将命令传递给e
,那么它会将模式缓冲区的内容视为外部命令。 sed
的简单替换命令,并将输出传递给sh
示例1:
echo 12687278 | sed "s/\([0-9]\{8,\}\)/date -d @\1/;e"
示例2:
echo 12687278 | sed "s/\([0-9]\{8,\}\)/date -d @\1/" |sh
测试1 (使用日语区域设置LC_TIME=ja_JP.UTF-8
):
测试2 (使用日语区域设置LC_TIME=ja_JP.UTF-8
):
<强>说明:强>
sed
命令使用
开放式长度说明符至少为8,而不是恰好为8。答案 1 :(得分:1)
Allan有一个很好的方法来处理动态参数:动态编写脚本并将其传递给shell!有用。它往往会更加不安全,因为您可能会将无意的shell组件传递给sh
- 例如,如果rm -f some-important-file
文件中包含sed
,那么sh
管道就不会更改该行,它也将与日期命令一起传递给xargs
。显然,如果您不控制输入,这只是一个问题。但错误可能会发生。
我更喜欢的类似方法是使用xargs
。对于新用户来说这是一次轻松的旅行,但非常强大。 $ echo -e "/tmp\n/usr/lib" | xargs ls -d
/tmp /usr/lib
背后的想法是它从其标准中获取输入,然后将其添加到由其自己的非选项参数组成的命令中并运行命令。例如,
echo
当然,这是一个微不足道的例子,但你可以通过添加echo -e "/tmp\n/usr/lib" | xargs echo ls -d
ls -d /tmp /usr/lib
更详细地了解其工作原理:
xargs
xargs
的输入成为$ cat dates.txt
Dates:
1517363346
自己的参数中指定的命令的附加参数。如有必要,请阅读两次,或者更好的是,使用这个功能强大的工具,并且灯泡应该亮起来。
这就是我如何处理你正在做的事情。当然,我不确定这在你的案例中是否合乎逻辑,但考虑到你在问题中提到的细节,这是我能做的最好的事情。
$ sed -ne '/^[0-9]\{8,\}$/ p' < dates.txt | xargs -I % -n 1 date -d @%
Tue Jan 30 19:49:06 CST 2018
我可以运行这样的命令:
echo -e "Dates:\n
有道理,因为我在写这篇文章前几分钟使用了commnad " > dates.txt
date +%s -n
来制作文件!让我们一起讨论它,我将打破我在这里所做的事情。
首先,我正在使用^
运行sed。这告诉它默认不打印行。这使得这个脚本工作,如果不是每一行都有8位以上的“日期”。我还在正则表达式的开头($
)和结束(p
)添加了锚点,因此该行只有 适当的数字(我意识到这可能不适合你,但不理解你的意见,我不能做得更好)。如果您的文件不完全由日期字符串组成,则这些是重要的更改。另外,我匹配至少 8个字符,因为现代日期字符串将更像10个字符长。最后,我向sed添加了一个命令xargs
。这告诉它打印匹配的行,这是必要的,因为我特意说不来打印不匹配的行。
下一位是-I
iteslf。 sed会将日期字符串写入xargs的标准输入。我只为xargs设置了一些设置。默认情况下,它会将标准输入添加到命令的末尾,以空格分隔。我不想要空格,所以我使用%
来指定替换字符串。 -n 1
没有特殊含义;它只是一个占位符,被输入取代。我使用%,因为它不是特殊字符,但在命令中很少使用。最后,我添加了date
以确保每次执行ls
时只使用了1个输入。 (xargs也可以在一起添加许多输入,如上面的xargs
示例所示)。
最终结果? Sed匹配仅由8个或更多数值组成的行,输出匹配的行。然后管道将此输出发送到-n 1
,它将每行分别(-I %
)并用每个匹配替换占位符(xargs
),然后执行date命令。
这是我非常喜欢的shell模式,每天使用,并通过一些巧妙的调整,可以非常强大。我鼓励使用linux shell的任何人立即了解{{1}}。
GNU sed用户还有另一种选择。虽然BSD的土地人对他们旧的BSD unix根源非常忠诚,但是从头开始编写用户空间的GNU人员为标准添加了许多精彩的增强功能。 GNU Sed显然可以为你运行一个subshell命令,然后为你做替换,这会非常容易。由于您使用的是bsd样式日期调用,我将假设您没有gnu sed供您使用。
答案 2 :(得分:0)
命令 date
略有不同,它应该使用标志 (-r) 而不是 (-d) 专属于 macOS
echo 12687278 | sed "s/\([0-9]\{8,\}\)/$(date -r \1)/g"
结果:
Thu Jan 1 09:00:01 JST 1970