Unix epoch与sed的约会

时间:2018-01-31 00:33:10

标签: bash date sed unix-timestamp

嘿,我不会将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'

任何提示?

3 个答案:

答案 0 :(得分:1)

由于帖子中缺少信息,我无法给出比这更好的答案,但可以使用sed执行命令!

你有不同的方法可以使用

  1. 直接sed e指令后跟命令 执行,如果你没有将命令传递给e,那么它会将模式缓冲区的内容视为外部命令。
  2. 使用sed的简单替换命令,并将输出传递给sh
  3. 示例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):

    enter image description here

    测试2 (使用日语区域设置LC_TIME=ja_JP.UTF-8):

    enter image description here

    <强>说明:

    1. 我会让您根据系统规格调整日期命令
    2. 由于现代日期超过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显然可以为你运行一个subshel​​l命令,然后为你做替换,这会非常容易。由于您使用的是bsd样式日期调用,我将假设您没有gnu sed供您使用。

答案 2 :(得分:0)

使用 sed:仅使用 macOS 进行测试

命令 date 略有不同,它应该使用标志 (-r) 而不是 (-d) 专属于 macOS

echo 12687278 | sed "s/\([0-9]\{8,\}\)/$(date -r \1)/g"

结果:

Thu Jan 1 09:00:01 JST 1970